记录下今天所学的深度优先搜索实例
思想想必我们大概了解,还是要通过经典的例题来练习
题目1:
假如有编号为1 、2、3 的3 张扑克牌和编号为l 、2 、3 的3 个盒子。
现在需要将这3 张扑克牌分别放到3 个盒子里面,并且每个盒子有且只能放一张扑克牌。那么一共有多少种不同的放法呢?
/**
全排列问题
dfs
解决思路:
1 2 3
1 3 2 //3先退出 2也退出 此时i=2 i++ ---> i=3 所以 3进入 再 2进入
后面的一次类推
*/
#include <stdio.h>
int flag[20];
int n;
int number[20];
void dfs(int x){
if(x==n+1)//第n+1层结束 开始输出
{
int i;
for(i=1;i<=n;i++)
printf("%d ",number[i]);
printf("\n");
return ;
}
for(int i=1;i<=n;i++){
if(flag[i]==0)//未被访问过
{
number[x]=i;//x代表第x层 从第一层开始
flag[i]=1;
dfs(x+1);
flag[i]=0;//置未访问过
}
}
}
int main(){
scanf("%d",&n);
dfs(1);
}
题目2:n皇后问题
/**
n皇后问题
8皇后一共有92种方法
*/
#include <stdio.h>
int u[20];//主对角线
int v[20];//斜对角线
int lie[20];
int a[20];//存放数字的
int n,count;
void dfs(int x){
if(x==n+1){//结束条件
count++;
return ;
}
for(int i=1;i<=n;i++){//行已经定住了
if(lie[i]==0&&u[x-i+n]==0&&v[x+i]==0){//符合一定的规则 解决列 主对角线 和副对角线
lie[i]=1;
u[x-i+n]=1;
v[x+i]=1;
a[x]=i;
dfs(x+1);
lie[i]=0;
u[x-i+n]=0;
v[x+i]=0;
}
}
}
int main(){
scanf("%d",&n);
dfs(1);//从第一层开始
printf("%d\n",count);
}