深度优先搜索关键在于解决“当下该如何做”。至于下一步如何做“则与”当下该如何做“是一样的。
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <ctype.h>
#include <string.h>
const int max=1000;
int a[10],book[10],n;//c语言全局变量在没有赋值以前默认为0
void dfs(int step){ //step表示站在第几个盒子面前
if(step==n+1){ //如果站在第n+1个盒子面前,则表示前n个盒子已经放好扑克牌
//输出一种排列
for(int i=1;i<=n;i++)
printf("%d",a[i]);
printf(" ");
return; //return返回之前的一步,最近一次调用dfs函数的地方
}
//此时站在第step个盒子面前,应该放哪张牌呢?按照1,2,3···n的顺序试一下
for (int 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);//通过递归处理第step+1个盒子
book[i]=0; //一定要将刚才尝试的扑克牌收回,才能进行下一次尝试
}
}
}
int main() {
scanf("%d",&n);//输入n为1~9之间的整数
dfs(1);
printf("\n");
return 0;
}
运行结果: