这次我们来说说迷宫这个题目。
对于迷宫这个题目来说,是一个将二维与搜索结合的一个典型题目,这里我展示一下深度优先搜索。
在棋盘中上下左右对应的行列坐标的变化。
const int dr[]={-1,0,1,0};
const int dc[]={0,1,0,-1};
注意移动过程中的问题,对此我们加一个判定函数check。
bool check(int i,int j){
if(i==ls || j==ls){return 0;}
if(i<0 || j<0){return 0;}
if(l[i][j]=='#'){return 0;}
if(flag[i][j]){return 0;}
return 1;
}
如果移动过程中到达了终点,我们利用tag做一个标记
if(flag[ls-1][ls-1]){
tag=1;
return;
}
同时注意只有在tag不为1时才继续深搜。
好了,把以上套入深搜也就是递归的框架,剩下的就是套路,做出来相信只是时间问题了。
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std;
const int dr[]={-1,0,1,0};
const int dc[]={0,1,0,-1};
int n,ls,tag;
char l[20+2][20+2];
bool flag[20+2][20+2];
bool check(int i,int j){
if(i==ls || j==ls){return 0;}
if(i<0 || j<0){return 0;}
if(l[i][j]=='#'){return 0;}
if(flag[i][j]){return 0;}
return 1;
}
void WalkLab(int r,int c){
if(flag[ls-1][ls-1]){
tag=1;
return;
}else{
for(int i=0;i<4;++i){
if(check(r+dr[i],c+dc[i])){
flag[r+dr[i]][c+dc[i]]=1;
if(!tag)WalkLab(r+dr[i],c+dc[i]);
}
}
}
}
int main() {
scanf("%d",&n);
for(int i=0;i<n;++i){
cin >> ls;
memset(flag,0,sizeof(flag));
tag=0;
flag[0][0]=1;
for(int i=0;i<ls;++i){
for(int j=0;j<ls;++j){
cin >> l[i][j];
}
}
WalkLab(0,0);
if(tag)cout << "YES" << endl;
else cout << "NO" << endl;
}
return 0;
}