迷宫(dfs经典)

1792:迷宫
总时间限制: 3000ms 内存限制: 65536kB
描述
一天Extense在森林里探险的时候不小心走入了一个迷宫,迷宫可以看成是由n * n的格点组成,每个格点只有2种状态,.和#,前者表示可以通行后者表示不能通行。同时当Extense处在某个格点时,他只能移动到东南西北(或者说上下左右)四个方向之一的相邻格点上,Extense想要从点A走到点B,问在不走出迷宫的情况下能不能办到。如果起点或者终点有一个不能通行(为#),则看成无法办到。
输入
第1行是测试数据的组数k,后面跟着k组输入。每组测试数据的第1行是一个正整数n (1 <= n <= 100),表示迷宫的规模是n * n的。接下来是一个n * n的矩阵,矩阵中的元素为.或者#。再接下来一行是4个整数ha, la, hb, lb,描述A处在第ha行, 第la列,B处在第hb行, 第lb列。注意到ha, la, hb, lb全部是从0开始计数的。
输出
k行,每行输出对应一个输入。能办到则输出“YES”,否则输出“NO”。
样例输入

2
3
.##
..#
#..
0 0 2 2
5
.....
###.#
..#..
###..
...#.
0 0 4 0

样例输出

YES
NO

一天晚上晚自习准备刷题,一开始看到这个题 大喜 ,觉得今晚上可以刷一些搜索的题目,因为题意比较简单 而且还是经典题型,
可是 整整花了两个多小时时间 去找错误,理解题意 真是有个坑啊 ,太坑了 坑的我都想爆粗口了 心里面一万个mmp。
呃,还是写篇文章 记录下这次这个坑,让我以后长个教训,让同样在遨游在题海中兄弟们少走点弯路

在这里插入图片描述在这里插入图片描述在这里插入图片描述
解题思路:
第一个坑:
在dfs里面 要注意退出循环的条件 怎么样才能退出这个循环,一种是找到目的地点就直接退出循环,一种是遍历完整个迷宫不能找到这个目的点 怎么退出循环
如果四个方向都搜索完了,都没有找到路径,那么函数运行结束,返回到上一层递归,在函数返回之前,我们要做一些处理,把我们刚才访问这个位置的时候做的一些标记全部都要撤销 还原之前的状态
第二个坑:
题目中描述 Extense想要从点A走到点B,问在不走出迷宫的情况下能不能办到。如果起点或者终点有一个不能通行(为#),则看成无法办到。
意思就是如果在出发点和目的地点 如果是不能通行的 那么就直接结束输出 NO,但是下面的代码要进入dfs函数,你仔细想循环完事了之后 是不是还要进行下面的判断 打印出 YES 或者NO 这儿就是坑点所在,
怎么解决这个问题,使用continue;至于continue的意思是什么意思,什么用法 我现在理解的是 continue是结束单次循环,break是结束整个循环体,如果还想深入了解 还请自行百度

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <vector>
#include <cstring>
using namespace std;
const int maxx = 1005;
int cors[5] = {0,0,0,-1,1}; //x 
int stra[5] = {0,1,-1,0,0}; //y 
char mapp[maxx][maxx];
int m,n;
int ha,la,hb,lb,F;
void dfs(int a,int b){
	if(F == 1){	return;	}
	if(a == hb && b == lb){
		F = 1;
		return;
	}
	for(int i = 1;i <= 4;i++){
		int	pre = a + cors[i];
		int	pry = b + stra[i];
		if(F == 0 && (pre >= 0) && (pre < n) && (pry >= 0)
		 && (pry < n) && (mapp[pre][pry] != '#')){	
			mapp[a][b] = '#';
			dfs(pre,pry);
		} 
	}
}
int main(){
	cin >> m;
	for(int i = 0;i < m;i++){
		
		cin >> n;
		F = 0;
		for(int i = 0;i < n;i++){
			for(int j = 0;j < n;j++){
				cin >> mapp[i][j];
			}
		}
		cin >> ha >> la >> hb >> lb;
		if(mapp[ha][la] == '#' || mapp[hb][lb] == '#'){
			cout << "NO" << endl; 
			continue;
		}
		dfs(ha,la);
		if(F == 1){
			cout << "YES" << endl; 
		}else{
			cout << "NO" << endl;
		}
	}
	return 0;
}
  • 3
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
矩阵迷宫一个非常有趣的问题,可以通过深度优先搜索算法(DFS)来解决。下面是一个使用Python语言编写的矩阵迷宫DFS程序的设计思路。 首先,我们需要定义一个函数来判断某个位置是否可以作为下一步的移动目标。在矩阵迷宫中,我们通常用1表示可行路线,用0表示墙壁或不可行路线。因此,我们可以定义一个函数is_valid(row, col, maze),其中row和col分别表示当前位置的行和列,maze是迷宫矩阵表示。在这个函数中,我们可以判断当前位置是否越界或者是墙壁,如果满足这些条件,则说明不可行,返回False,否则返回True。 接下来,我们可以定义一个递归的函数dfs(row, col, maze, visited),其中row和col表示当前位置的行和列,maze是迷宫矩阵表示,visited是一个与maze相同大小的矩阵,表示是否已经访问过。在这个函数中,我们首先判断当前位置是否是终点(例如迷宫的右下角),如果是,则找到了一条可行路径,返回True。如果当前位置不是终点,则标记当前位置为已访问,并依次判断当前位置的上、下、左、右四个方向是否可行。如果某个方向可行,我们可以将当前位置移动到该方向,并递归调用dfs函数。如果在某个方向上找到了一条可行路径,我们可以返回True,否则继续搜索其他方向。如果四个方向都不可行,我们可以将当前位置的visited标记为False,并返回False。 最后,我们可以定义一个主函数solve(maze),其中maze是迷宫矩阵表示。在这个函数中,我们可以首先创建一个与maze相同大小的visited矩阵,并将所有元素初始化为False。接下来,我们调用dfs函数从迷宫的起点(例如迷宫的左上角)开始搜索,并将结果返回。 这样,我们就完成了一个使用深度优先搜索算法解决矩阵迷宫问题的程序。通过调用主函数,并传入迷宫矩阵作为参数,我们可以获得是否存在可行路径的结果。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值