图的深搜与走迷宫
程序员文章站
2022-05-20 20:26:29
...
题目描述:(出自《啊哈算法》第四章第二节)
1 | 2 | 3 | 4 | 5 | 6 | |
---|---|---|---|---|---|---|
1 | (a,b) | |||||
2 | * | |||||
3 | ||||||
4 | * | |||||
5 | (x,y) | |||||
6 |
从(a,b)走到(x,y),*代表障碍物,求最短步数。
思路:从ab出发按照上下左右一定的规则一步一步的走,可以看做图的深搜,也可以看做树的深搜,因为图是能转换成树的。
#include<stdio.h>
int bj[100][100];//标记是否已用
int a[100][100];//存储迷宫
int n,m;
int min=999999;
int w,u,x,y;
int next[4][2]={{0,1},{1,0},{0,-1},{-1,0}};//行走规则右下左上
void dfs(int w,int u,int step){
if(w==x&&u==y){
if(step<min)
min=step;
return ;//必须返回
}
int wi;
int ui;
for(int i=0;i<4;i++){
wi=w+next[i][0];
ui=u+next[i][1];
if(wi>n||ui>m||wi<1||ui<1||a[wi][ui]==1||bj[wi][ui]==1){
continue;
}
bj[wi][ui]=1;
dfs(wi,ui,step+1);
bj[wi][ui]=0;
}
}
int main()
{
scanf("%d %d",&n,&m);//n行m列
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
scanf("%d",&a[i][j]);//获取一个01数组,1表示障碍物,0表示空地
}
}
bj[w][u]=1;
scanf("%d%d%d%d",&w,&u,&x,&y);//wu代表出发点,xy代表终点
dfs(w,u,0);
printf("%d",min);
return 0;
}
测试数据:
5 4
0 0 1 0
0 0 0 0
0 0 1 0
0 1 0 0
0 0 0 1
1 1 4 3
结果:7
上一篇: 数据结构-图的深度优先搜索和广度优先搜索(邻接表实现)
下一篇: 迷宫问题---深搜