迷宫问题----深度优先遍历

什么是深度优先搜索:

深度优先搜索是一种:枚举所有完整路径以遍历所有情况的搜索方法。
  我们可以想象我们正在走一个迷宫,没有上帝视角也没有通信设施,我们只能一条路一条路的去试(枚举),以当前位置为起点,沿着一条路走,碰到岔路口的时候,选择其中一个岔路口前进,如果选择的的这个岔路口是死路,就退回这个岔口道,然后选择另一个岔路前进。如果这个岔口道的所有道路都是死路,那么就退回到上一个岔口道,选择一条没有走过的道路,然后继续走。循环以上方法,直到找到出口为止。这样的搜索方式就叫做深搜。

题目:

第一行给出坐标n,m,随后n表示地图的行,m表示地图的列,接下来的n行m列表示为迷宫,0表示空地,1表示障碍物。最后一行4个数字前两个数表示为迷宫的入口坐标x,y;后两个数表示出口坐标x1,y1;

代码如下:

/**
第一行给出坐标n,m,随后n表示地图的行,m表示地图的列,接下来的n行m列表示为迷宫,0表示空地,1表示障碍物。
最后一行4个数字前两个数表示为迷宫的入口坐标x,y;后两个数表示出口坐标x1,y1;
**/
#include<bits/stdc++.h>
using namespace std;
int n,m,x,y,x1,y1,min_=99999999;
int book[100][100];//表示该数是否使用过 
int a[100][100];  //用于存储迷宫 
int next_[4][2]={{0,1},{1,0},{0,-1},{-1,0}};   //上下左右四个方向 
int dfs(int x,int y,int stept){
	if (x==x1&&y==y1){   //若已经到达终点,则更新当前的步骤值,然后返回当前状态。
		if(min_>stept)   min_=stept;
		return 0;     
	}
	for(int i=0;i<4;i++){     //枚举四个方向 
		int xt=x+next_[i][0];
		int yt=y+next_[i][1];   //计算下一步的x和y坐标
		if(xt<1||xt>n||yt<1||yt>m)      continue;   //判断是否越界
		if(a[xt][yt]==0&&book[xt][yt]==0){   //空地且没有被标记过 
			book[xt][yt]=1;     // 标记一下
			dfs(xt,yt,stept+1);   //走下一步
			book[xt][yt]=0;       //返回时,把标记过的从新设置为未标记
		} 
		
	}
	return 0;
}
int main(){
//数据读入
	scanf("%d %d",&n,&m);
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++){
			scanf("%d",&a[i][j]);
		}
	}
	scanf("%d %d %d %d",&x,&y,&x1,&y1);
	book[x][y]=1;    //把起始位置设置为已经标记走过
	dfs(x,y,0);   //从起始位置开始寻找 ,初始步数是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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值