1215:迷宫
时间限制: 1000 ms 内存限制: 65536 KB
提交数: 22711 通过数: 6717
【题目描述】
一天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
这道题主要用到DFS(深搜)算法
1 #include <bits/stdc++.h> 2 using namespace std; 3 char a[105][105];//地图 4 int fx[4][2]={{1,0},{0,1},{-1,0},{0,-1}};//走向 5 int book[105][105];//判断是否访问,避免无限绕圈 6 int n,m,la,lb,na,nb,x,y,tr;//la,lb起始位置,na,nb目标位置,x,y下一步坐标,tr能否到达 7 bool dfs(int la,int lb){ 8 if(la==na && lb==nb){//到达终点时 9 tr=1; 10 } 11 for(int i=0;i<4;i++)//判断下一步 12 { 13 x=la+fx[i][0]; 14 y=lb+fx[i][1];//下一步坐标 15 if(x<0||x>m-1||y<0||y>m-1)continue;//判断是否出界 16 if(book[x][y]==0&&a[x][y]=='.'){//判断能否走通 17 book[x][y]=1;//标记访问 18 dfs(x,y); 19 } 20 } 21 } 22 int main() 23 { 24 cin>>n; 25 while(n--){ 26 cin>>m; 27 for(int i=0;i<m;i++){ 28 for(int j=0;j<m;j++){ 29 cin>>a[i][j]; 30 } 31 } 32 cin>>la>>lb>>na>>nb;//输入起点终点 33 book[la][lb]=1;//起点标记访问 34 dfs(la,lb); 35 memset(book,0,sizeof(book));//重置 36 if(a[la][lb]=='#'||a[na][nb]=='#'){//特判 37 cout<<"NO"<<endl; 38 continue; 39 } 40 if(tr==1)cout<<"YES"<<endl; 41 else cout<<"NO"<<endl; 42 tr=0;//重置结果 43 } 44 45 return 0; 46 }