1
已解决
栾峻岩
初级天翼
初级天翼
网址: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