DFS——wyh的迷宫

DFS——wyh的迷宫

题目描述

给你一个n*m的迷宫,这个迷宫中有以下几个标识:
s代表起点
t代表终点
x代表障碍物
.代表空地
现在你们涵哥想知道能不能从起点走到终点不碰到障碍物(只能上下左右进行移动,并且不能移动到已经移动过的点)。

输入描述:

输入第一行一个整数T(1<=T<=10)
接下来有T组测试数据,对于每一组测试数据,第一行输入2个数n和m(1<=n,m<=500)
接下来n行,每行m个字符代表这个迷宫,每个字符都是上面4个中的一种
数据保证只有一个起点和一个终点

输出描述:

对于每一组测试数据,如果可以的话输出YES,不可以的话输出NO

示例

输入

1
3 5
s…x
x…x
…tx

输出

YES

#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<iostream>
#include<algorithm>
using namespace std;
char f[1000][1000];
int x[4]={1,-1,0,0},y[4]={0,0,1,-1};
int n,m;
int dfs(int a,int b)
{
	int aa,bb,flag=0;
	if(f[a][b]=='t'){
		return 1;
	}
	else{
		for(int i=0;i<4;i++){
			aa=a+x[i];
			bb=b+y[i];
			if(f[aa][bb]!='x'&&aa>=0&&aa<n&&bb>=0&&bb<m){
				f[a][b]='x';
				flag=dfs(aa,bb);
				if(flag==1){
					return 1;
				}
				else{
					continue;
				}
			}
		}
	}
	return 0;
}
int main()
{
	int t,a,b;
	cin>>t;
	while(t--){
		cin>>n>>m;
		getchar();
		for(int i=0;i<n;i++){
			for(int j=0;j<m;j++){
				cin>>f[i][j];
				if(f[i][j]=='s'){
					a=i;
					b=j;
				}
			}
		}
		if(dfs(a,b)){
			cout<<"YES"<<endl;
		}
		else{
			cout<<"NO"<<endl;
		}
	}
	return 0;
}
发布了98 篇原创文章 · 获赞 3 · 访问量 4717

猜你喜欢

转载自blog.csdn.net/linjiayina/article/details/104101535