DFS深搜解决迷宫问题

在这里插入图片描述
在这里插入图片描述

/* 读入一个m行n列的数组,其中1表示空地,2表示障碍物;
//从起始点走到终点距离最短是多少,要求给出起始点和终点坐标。 
5 4
1 1 2 1
1 1 1 1
1 1 2 1
1 2 1 1
1 1 1 2
1 1 
4 3
*/

//	       (x-1,y)
//	(x,y-1)	(x,y)  (x,y+1)
//		   (x+1,y)
#include<iostream>
using namespace std;

int m,n,p,q,mins=999999999;
int a[100][100];//1表示空地,2表示障碍物
int v[100][100];//0表示未访问,1表示访问

void dfs(int x,int y,int step){
	if(x==p&&y==q){//终点 
		if(step<mins)
		  mins=step;
		return ;
	}
	//顺时针试探
	//右
	if(a[x][y+1]==1 && v[x][y+1]==0){
		v[x][y+1]=1;
		dfs(x,y+1,step+1);
		v[x][y+1]=0;
	} 
	//下
	if(a[x+1][y]==1 && v[x+1][y]==0){
		v[x+1][y]=1;
		dfs(x+1,y,step+1);
		v[x+1][y]=0;
	}
	//左
	if(a[x][y-1]==1 && v[x][y-1]==0){
		v[x][y-1]=1;
		dfs(x,y-1,step+1);
		v[x][y-1]=0;
	}
	//上	
	if(a[x-1][y]==1 && v[x-1][y]==0){
		v[x-1][y]=1;
		dfs(x-1,y,step+1);
		v[x-1][y]=0;
	} 
	return ;
}

int main(){
	int startx,starty;//起点坐标 
	cin>>m>>n;
	for(int i=1;i<=m;i++)
		for(int j=1;j<=n;j++)
			cin>>a[i][j];//1表示空地,2表示障碍物
	cin>>startx>>starty>>p>>q; //终点坐标
	//从起点进行深度优先搜索
	v[startx][starty]=1;
	dfs(startx,starty,0);
	cout<<mins<<endl; 
	
	return 0;
} 

优化代码:

#include<iostream>
using namespace std;

int m,n,p,q;
int mins=99999999;
int a[100][100];//1表示空地,2表示障碍物
int v[100][100];//0表示未访问,1表示访问
//方向数组					x-1,y				
//					x,y-1	x,y	 x,y+1
// 						   x+1,y
int dx[4]={0,1,0,-1};              
int dy[4]={1,0,-1,0}; 
void dfs(int x,int y,int step){
	if(x==p&&y==q){
		if(step<mins) mins=step;
		return;
	}
	for(int i=0;i<4;i++){
		int tx,ty;//方向点
		tx=x+dx[i];
		ty=y+dy[i];
		if(a[tx][ty]==1&&v[tx][ty]==0){
			v[tx][ty]=1;
			dfs(tx,ty,step+1);
			v[tx][ty]=0;
		} 
	}	
	return ;
}
int main(){
	cin>>m>>n;
	for(int i=1;i<=m;i++)
	for(int j=1;j<=n;j++)
		cin>>a[i][j];
	int startx,starty;
	cin>>startx>>starty>>p>>q;
	dfs(startx,starty,0);
	cout<<mins<<endl;
	return 0;
}

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,让我来为您讲解如何使用DFS算法来解决迷宫问题DFS算法是一种索算法,它通过度优先遍历图或树来寻找目标节点。在迷宫问题中,我们可以将每一个可行的位置看做是图中的一个节点,然后使用DFS算法来索从起点到终点的路径。 具体的实现步骤如下: 1. 定义一个二维数组来表示迷宫,其中0表示可以通过的通道,1表示障碍物。 2. 定义一个visited数组来记录每个节点是否被访问过。 3. 定义一个栈来保存索过程中经过的节点。 4. 从起点开始,将其加入栈中,并标记为已经访问。 5. 对于栈中的每个节点,依次遍历其相邻节点,如果相邻节点未被访问过且可以通过,则将其加入栈中,并标记为已经访问。 6. 如果最终找到了终点,索结束,返回路径;否则,回溯到上一个节点,继续索直到找到终点或者栈为空。 7. 如果栈为空,表示没有找到从起点到终点的路径。 下面是一个简单的实现示例代码: ```python def dfs(maze, visited, path, start, end): if start == end: return path + [end] visited[start[0]][start[1]] = True for dx, dy in [(1, 0), (-1, 0), (0, 1), (0, -1)]: x, y = start[0] + dx, start[1] + dy if 0 <= x < len(maze) and 0 <= y < len(maze[0]) and not visited[x][y] and maze[x][y] == 0: res = dfs(maze, visited, path + [start], (x, y), end) if res: return res return None # 测试代码 maze = [[0, 1, 0, 0, 0], [0, 1, 0, 1, 0], [0, 0, 0, 0, 0], [0, 1, 1, 1, 0], [0, 0, 0, 1, 0]] visited = [[False] * len(maze[0]) for _ in range(len(maze))] path = [] start = (0, 0) end = (4, 4) res = dfs(maze, visited, path, start, end) if res: print(res) else: print("找不到路径!") ``` 希望这个回答可以帮助您解决迷宫问题

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值