数的全排列(DFS)
这里对前面 数的全排列 进行一个完善
思路:DFS
首先我们还是对于123进行一次举例(大神请跳过这步)
1 2 3
1 3 2
2 1 3
2 3 1
3 2 1
3 1 2
代码
#include<stdio.h>
//此处特别说明一下:
// C语言的全局变量在没有赋值以前默认为0
// 因此这里的book数组无需全部再次赋值
int a[10], book[10], n;
void dfs(int step){ //step表示现在站站在第几个盒子之前
int i;
if(step == n + 1){ //如果站在了n + 1个盒子面前,则代表钱n个盒子已经放好了扑克牌
//输出一种排列
for(i = 1; i <= n; i++)
printf("%d",a[i]);
printf("\n");
return;
}
//此时已经站到了第step个盒子前面
//按照1,2,3...n的顺序进行尝试
for(i =1; i <= n; i++){
//判断扑克牌i是否还在手上
if(book[i] == 0){ //如果book[i]等于0则表示第i号还在手上
//开始尝试使用扑克牌
a[step] = i; //将i号扑克放到第step个盒子中
book[i] = 1; //将book[i]设为1,表示i号扑克已经不在手上
//第step个盒子已经放好了扑克牌,往下一个盒子走
dfs(step + 1); //这里递归,自己调用自己
book[i] = 0; //要将扑克牌收回,才可以进行下一步尝试
}
}
return;
}
int main(){
scanf("%d",&n);//注意这里的输入值的范围为1 ~ 9
dfs(1); //从第一个盒子开始
return 0;
}