#include<stdio.h>
#include<string.h>
const int MAX=10
int n
bool used[MAX]={false}
int a[MAX]
int ans[MAX]
void DFS(int deep)
{
int i
if(deep==n)
{
for(i=0i<ni++)
{
printf("%d ",ans[i])
}
puts("")
return
}
for(i=0i<ni++)
{
if(used[i])continue
used[i]=true
ans[deep]=a[i]
DFS(deep+1)
used[i]=false
}
}
int main()
{
int i
scanf("%d",&n)
for(i=0i<ni++)
{
scanf("%d",&a[i])
}
DFS(0)
return 0
}
不要急于看代码,你心理要知道全排列的思路,不注重思路是很多程序员易犯的错误。全排列算法:
如果我求得固定第一位后的排列,那么全部排列就可以求出,固定第一位有10种可能,可以循环求得。
如果我求得固定第二位后的排列,固定第一位后的排列就可以求出,固定第二位有9种可能,可以循环求得。
。。。
如果我求得固定第10位后的排列,固定第9位后的排列就可以求出,固定第10位有1种可能,可以循环求得。
这很明显是递归的算法。
static void dfs(int start,int end,int num){//为全部排列的集合,start为数字的位置,end为最后一位,num多余的
if(start==end){//当前的数字位置为最后一位时,说明,一个序列已经生成
for(int i=1i<endi++)
System.out.print(a[i]+" ")//输出序列
System.out.println()
}
else{//序列没有生成时
for(int i=1i<endi++){
if(vis[i])//i是否在前面使用过
continue//如果是直接跳过
a[start]=i//确定start位置的数字,当start为1时就是确定第一位,有10种可能
vis[i]=true//设置i为已使用状态,避免下一位使用i
dfs(start+1,end,num)//求得确定start位后的全部序列
vis[i]=false//设置i为未使用状态
}
}