- 描述
- 一天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
源代码
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <iostream>
using namespace std;
const int dx[4]={1,-1,0,0};
const int dy[4]={0,0,1,-1};//定义移动方向
char tu[101][101];//定义全图
int ha,la,hb,lb,n;
int t;
bool flag=false;//定义flag
void dfs(int ha,int la){//定义dfs函数,输入当前行与列
tu[ha][la]='#';//封闭当前位置
if(ha==hb&&la==lb){
flag=true;
}//若可以到达B点,定义flag为true;
else for(int i=0;i<4;i++){
int hh=ha+dx[i];
int ll=la+dy[i];//枚举移动的方式
if(hh>0&&hh<=n&&ll>0&&ll<=n&&tu[hh][ll]=='.'&&vhash[hh][ll]==0){//可行性判断
dfs(hh,ll);//进行下一次函数
}
}
}
void readp(){
scanf("%d",&t);//输入数据量
while (t--){//循环输入数据
cin>>n;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
cin>>tu[i][j];//输入全图
cin>>ha>>la>>hb>>lb;//输入A点行与列,B点行与列(此处是从0开始)
ha+=1;
la+=1;
hb+=1;
lb+=1;//调整至从1开始
if(tu[ha][la]=='.'&&tu[hb][lb]=='.')dfs(ha,la);//判断A,B点是否可通行
if(flag)cout<<"YES"<<endl;
else cout<<"NO"<<endl;//根据flag输出结果
flag=false;//刷新flag
}
}
int main(){
readp();
return 0;
}
错因分析:
1.tu数组不符合大小
2.刷新地图,导致超时
3.未考虑“起点或者终点有一个不能通行(为#)“的情况