欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

图的深搜与走迷宫

程序员文章站 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