无重复全排列 [2*+]
内存限制:128 MB时间限制:1.000 S
评测方式:文本比较命题人:外部导入
提交:46解决:32
提交提交记录统计讨论版露一手!
题目描述
输出N个数的无重复全排列
Input
输入一个数值N
1<=N=50
Output
输出N个数的无重复全排列,每个数之间用空格隔开
最后一行输出无重复全排列的个数。
Sample Input
3
Sample Output
1 2 3 1 3 2 2 1 3 2 3 1 3 1 2 3 2 1 Total=6
Hint
剪枝时,用标记法(哈希查表)判重,加快判重速度
样例输入 复制
3
样例输出 复制
1 2 3 1 3 2 2 1 3 2 3 1 3 1 2 3 2 1 Total=6
回溯 DFS
这道题用到了深搜的思想,具体实现方法如下:
#include<stdio.h>
int a[51],book[51],n,b;//定义全局变量,c语言全局变量在没有赋值之前都默认为0
void dfs(int step)
{
int i;
if(step==n+1)
{//输出一种排列
for(i=1;i<=n;i++)
{
printf("%d ",a[i]);
b++;//记录输出的个数
}
printf("\n");//输出一种排列后换行
return;//返回之前调用的地方
}
for(i=1;i<=n;i++)
{
if(book[i]==0)
{
a[step]=i;
book[i]=1;
dfs(step+1);//递归
book[i]=0;
}
}
return;
}
int main(void)
{
scanf("%d",&n);
dfs(1);
getchar();
printf("Total=%d",b/n);
return 0;
}