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做一个标记
同时注意只有在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;
}
对于迷宫这个题目来说,是一个将二维与搜索结合的一个典型题目,这里我展示一下深度优先搜索。
在棋盘中上下左右对应的行列坐标的变化。
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;
}
相关文章推荐
- codevs 1215_迷宫_bfs
- BFS简单题套路_Codevs 1215 迷宫
- Codevs 1215 迷宫 裸BFS
- codevs 1215 迷宫 广搜bfs 深搜dfs
- 20160318 CodeVS 1215 走迷宫,3286 火柴排队,2618 核电站问题
- 1215 迷宫
- codevs1215走迷宫
- CODE[VS]1215 迷宫
- 1215 迷宫
- CodeVS 3344 迷宫 题解
- [Wikioi 1215]迷宫
- nku1215: 小鼠迷宫问题
- Codevs 1215 迷宫(DFS)
- 1215 迷宫
- codevs 1337 银行里的迷宫
- 1215 迷宫
- Codevs 1337 银行里的迷宫
- codevs1215 迷宫
- 1215 迷宫
- 【Codevs1215】迷宫