问题标题: 请问酷町堂1013题 有重复元素的排列问题 这道题怎么做?想了半小时也没有想出来?请各位大神、大佬帮帮忙。

1
0
已解决
栾峻岩
栾峻岩
初级天翼
初级天翼

网址:http://judge.codingtang.com/problem/1013/

题目:

设R={ r1, r2 , …, rn}是要进行排列的n个元素。其中元素r1, r2 , …, rn可能相同。试设计一个算法,列出R的所有不同排列。

给定n 以及待排列的n 个元素。计算出这n 个元素的所有不同排列。

输入描述 Input Description

文件的第1 行是元素个数n,1≤n≤500。接下来的1 行是待排列的n个元素。

输出描述 Output Description

计算出的n个元素的所有不同排列输出到文件perm.out中。文件最后1行中的数是排列总数。

样例输入 Sample Input


 

4
aacc

样例输出 Sample Output


 

aacc
acac
acca
caac
caca
ccaa
6

请各位大佬、大神帮帮忙吧!做过路过千万不要错过呀!!!!!

栾峻岩在2018-01-25 20:12:28追加了内容
#include <iostream>
#include <string>
using namespace std;
int n;
bool used[510];
int f[510];
int total[510];
string a;
int ans;
void dfs(int dep)  
{  
    int r;  
    if (dep==n+1)  
    {  
        ans++; 
        for (r=1;r<=n;++r)  
            cout<<char(f[r]+96);
        cout<<endl;
        return;  
    }  
    for (r=1;r<=26;++r) 
    {
        if (f[r]>0)
        {  
            a[dep]=r;  
            f[r]--;
            dfs(dep+1);  
            f[r]++;
        } 
    } 

}  
int main()
{
    cin>>n;
    getline(cin,a);
    getline(cin,a);
    for (int i=1;i<4;i++)
    {
        f[int(a[i]-69)]++;
    }
    dfs(1);
    cout<<ans;
    return 0;
}

@梁锦程,根据你说的,改了还是20分。


2
已采纳
梁锦程
梁锦程
高级光能
高级光能

【解题思路】

刚开始觉得就是一个全排列,只不过判重非常麻烦,然而后来发现并不可能实现(⊙o⊙)…

读入之后,首先记录各个字母在字符串中出现的次数。这就相当于一个计数器,每次取出一个字母它的计数器就-1;

然后开始搜索。、。注意每一层搜索是按照26个小写字母循环,如果计数器不等于0,就可以取用;

输出~~╮(╯▽╰)╭

void dfs(int dep)  
{  
    int r;  
    if (dep==n+1)  
    {  
        ans++;//记录方案总数  
        for (r=1;r<=n;++r)  
          printf("%c",a[r]+96);  
        printf("\n");  
        return;  
    }  
    for (r=1;r<=26;++r)  
      if (f[r]>0)//如果这个字母没有取完  
      {  
        a[dep]=r;//a依然是记录数组~  
        f[r]--;//计数器-1  
        dfs(dep+1);  
        f[r]++;//回溯一步  
      }  
}  

 

1
0
梁锦程
梁锦程
高级光能
高级光能

洛谷上,打开,有事,快!!!

0
0
王雪阳
王雪阳
高级守护
高级守护

核心

void search(int x)
{
    if(x>n)
    {
        for(int i=1;i<=n;i++)
            cout<<char(a[i]+96);
        cout<<endl;
        ans++;
    }
    else
    {
        for(int i=1;i<=26;i++)
            if(bj[i]>0)
            {
                a[x]=i;
                bj[i]--;
                search(x+1);
                bj[i]++;
            }
    }
}

 

0
王子轩
王子轩
新手光能
新手光能

刚开始觉得就是一个全排列,只不过判重非常麻烦,然而后来发现并不可能实现(⊙o⊙)…

读入之后,首先记录各个字母在字符串中出现的次数。这就相当于一个计数器,每次取出一个字母它的计数器就-1;

然后开始搜索。、。注意每一层搜索是按照26个小写字母循环,如果计数器不等于0,就可以取用;

输出~~╮(╯▽╰)╭

我要回答