深度优先搜索 Depth First Search(DFS)
- 有编号为1,2,3,4的4张扑克牌和编号为1,2,3,4的4个盒子。现在需要将这4张扑克牌分别放到4个盒子里,并且每个盒子只能放一张扑克牌,一共有多少种方法?
#include <stdio.h>
int sum=0, n, book[10]={0},a[10]={0}; //book:手中的牌 a:盒子
void dfs(int step){
int i;
if (step == n+1){ // 如果站在第n+1个盒子面前,则表示前n个盒子已经放好扑克牌
sum++;
for(i=1;i<=n;i++){
printf("%d ",a[i]);
}
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;
}
}
}
int main(){
do{
printf("请输入牌的总数(1-9):");
scanf("%d",&n); // 有n张牌放入n个盒子中 n:1,2,3,...,n
printf("\n");
}while(n<1 || n > 9);
dfs(1);
printf("total ways:%d",sum);
printf("\n");
return 0;
}
2.手上有编号为1-9的9张扑克牌,然后将这9张扑克牌放到9个盒子里,使得 a b c + d e f = g h i 成立。
// 判断a[1] * 100 + a[2] * 10 + a[3] + a[4] * 100 + a[5] * 10 + a[6] == a[7]*100 + a[8] * 10 + a[9] 是否成立
#include <stdio.h>
void dfs(int step){
int i;
if(step == 10){
if(a[1] * 100 + a[2] * 10 + a[3] + a[4] * 100 + a[5] * 10 + a[6] == a[7]*100 + a[8] * 10 + a[9]){
for(i = 1;i<=9; i++){
printf("%d ",a[i]);
if(i==3) printf("+");
if(i==6) printf("=");
}
printf("\n");
}
return ;
}
for(i = 1; i <=9; i++){
if(book[i] == 0){
a[step] = i;
book[i] = 1;
dfs(step+1);
book[i] = 0;
}
}
return ;
}
3.迷宫找人
迷宫由n行m列的单元格组成(n, m <= 50),每个单元格要么是空地,要么是障碍物。找到一条从迷宫的起点通往人所在位置的最短路径。障碍物不能走,也不能走到迷宫之外。
// 用二维数组来存储这个迷宫,入口为(1,1),人在(p,q),就是找(1,1)到(p,q)的最短路径
#include<stdio.h>
int n,m,p,q,min=999999,book[51][51]={0},a[51][51]={0};
int next[4][2] = {{0,1},{1,0},{0,-1},{-1,0}};
void maze_dfs(int x, int y, int step){
int k,tx,ty;
// 判断是否终点
if(x == p && y == q){
if(step < min)
min =step;
return ;
}
// 不是终点就有4个方向可以走
for(k=0;k<=3;k++){
tx = x + next[k][0];
ty = x + next[k][1];
if(tx < 1 || tx > n || ty < 1 || ty > m)
continue;
//判断该点是否为障碍物或者已经在路径中
if(a[tx][ty] == 0 && book[tx][ty] == 0){
book[tx][ty] = 1;
maze_dfs(tx,ty,step+1);
book[tx][ty] = 0;
}
}
return ;
}
int main(){
int i,j,startx,starty;
do{
printf("请输入迷宫大小,n行m列: n,m<=50,以空格分隔,以回车结束:");
scanf("%d %d",&n,&m);
}while(n < 0 || m < 0 || n > 50 || m > 50);
printf("输入迷宫,0:空地 1:障碍物\n");
for(i = 1; i <= n; i++){
for(j = 1; j <=m; j++){
scanf("%d",a[i][j]);
}
}
printf("输入的迷宫为:\n");
for(i = 1; i <= n; i++){
for(j = 1; j <=m; j++){
printf("%d ",a[i][j]);
}
printf("\n");
}
printf("输入起点和目的地:");
scanf("%d %d %d %d", &startx, &starty, &p, &q);
maze_dfs(startx, starty, 0);
printf("\n最少走%d步\n",min);
return 0;
}