您的位置:首页 > 其它

codevs 1215 迷宫

2017-06-30 20:12 218 查看
这次我们来说说迷宫这个题目。

对于迷宫这个题目来说,是一个将二维与搜索结合的一个典型题目,这里我展示一下深度优先搜索。

在棋盘中上下左右对应的行列坐标的变化。

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: