题目描述
一天Extense在森林里探险的时候不小心走入了一个迷宫,迷宫可以看成是由 n∗n 的格点组成,每个格点只有2种状态”.”和”#”,前者表示可以通行后者表示不能通行。
同时当Extense处在某个格点时,他只能移动到东南西北(或者说上下左右)四个方向之一的相邻格点上,Extense想要从点A走到点B,问在不走出迷宫的情况下能不能办到。
如果起点或者终点有一个不能通行(为#),则看成无法办到。
注意:A、B不一定是两个不同的点。
样例
输入样例:
2
3
.##
..#
#..
0 0 2 2
5
.....
###.#
..#..
###..
...#.
0 0 4 0
输出样例:
YES
NO
十分简单的一道深搜”模板”题.
需要注意有多组测试数据,所以一定要记得清空上一次的数据.
注意当然还要判断起点和终点是否合法.
时间复杂度 O(我不知道)
C++ 代码
#include<bits/stdc++.h>
using namespace std;
int n,x1,x2,ya1,ya2,vis[105][105];
char mg;
bool flag;//记录是否有解
int dx[4][2]={{0,1},{0,-1},{1,0},{-1,0}};//方向数组
void dfs(int x,int y)//深搜模板
{
for(int i=0;i<4;i++){
int nx=x+dx[i][0];
int ny=y+dx[i][1];
if(nx>=0&&nx<n&&ny>=0&&ny<n&&vis[nx][ny]==0){
vis[nx][ny]=1;
if(nx==x2&&ny==ya2){//到达了终点
printf("YES\n");
flag=true;
break;
}
else
dfs(nx,ny);
}
}
}
int main()
{
int N;
scanf("%d",&N);
while(N--){
memset(vis,0,sizeof(vis));//多组数据一定要记得清空
flag=false;
scanf("%d",&n);
for(int i=0;i<n;i++)
for(int j=0;j<n;j++){
cin>>mg;
if(mg=='#')
vis[i][j]=1;
}
scanf("%d %d",&x1,&ya1);
scanf("%d %d",&x2,&ya2);
if(vis[x1][ya1]||vis[x2][ya2]){//判断起点和终点是否合法
printf("NO\n");
continue;
}
else
dfs(x1,ya1);
if(!flag)//无解
printf("NO\n");
}
return 0;
}
%%%%