您的位置:首页 > 其它

全排列算法递归实现(可重集)

2014-12-02 14:11 239 查看
  问题描述:输入t组数据,每组数据输入一个数字k,以及k个数字,输出他们的全排列。

  样例输入:1  3

                    1  2  3

  样例输出:1  2  3

  代码:

<span style="font-family:Times New Roman;">#include<stdio.h>
#include<math.h>
#include<algorithm>
#define maxn 1000
using namespace std;
void quan(int *p, int *a, int cur, int n)
{
if (cur == n)
{
for (int i = 0; i < n; i++)
printf("%d ",a[i]);
printf("\n");
}
else
{
for (int i = 0; i < n; i++)
if(i==0||p[i]!=p[i-1])
{
int c1 = 0, c2 = 0;
for (int j = 0; j < cur; j++)
if (a[j] == p[i])
c1++;
for (int j = 0; j < n; j++)
if (p[j] == p[i])
c2++;
if (c1 < c2)
{
a[cur] = p[i];
quan(p, a, cur + 1, n);
}
}
}

}
int main()
{
int p[maxn];
int a[maxn];
int n;
int t;
while (scanf("%d", &t)!=EOF)
{
while (t--)
{
scanf("%d", &n);
for (int i = 0; i < n; i++)
{
scanf("%d",&p[i]);
}
sort(p, p + n);
quan(p, a, 0 , n);
}
}
return 0;
}</span>

参考书籍:《算法竞赛入门经典》-- 刘汝佳
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  acm