【OpenJ_Bailian - 2790】迷宫(bfs)
-->迷宫
Descriptions:
一天Extense在森林里探险的时候不小心走入了一个迷宫,迷宫可以看成是由n * n的格点组成,每个格点只有2种状态,.和#,前者表示可以通行后者表示不能通行。同时当Extense处在某个格点时,他只能移动到东南西北(或者说上下左右)四个方向之一的相邻格点上,Extense想要从点A走到点B,问在不走出迷宫的情况下能不能办到。如果起点或者终点有一个不能通行(为#),则看成无法办到。
Input
第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开始计数的。
Output
k行,每行输出对应一个输入。能办到则输出“YES”,否则输出“NO”。
Sample Input
2 3 .## ..# #.. 0 0 2 2 5 ..... ###.# ..#.. ###.. ...#. 0 0 4 0
Sample Output
YES NO
题目链接:
https://vjudge.net/problem/OpenJ_Bailian-2790
经典入门级bfs 迷宫搜索题 先简单判断一下初始位置和结束位置 在进行bfs即可
AC代码
#include <iostream> #include <cstdio> #include <fstream> #include <algorithm> #include <cmath> #include <deque> #include <vector> #include <queue> #include <string> #include <cstring> #include <map> #include <stack> #include <set> #include <sstream> #define mod 1000000007 #define eps 1e-6 #define ll long long #define INF 0x3f3f3f3f #define MEM(x,y) memset(x,y,sizeof(x)) using namespace std; int T,n,m; int sx,sy,ex,ey;//初始位置 结束位置 char mp[1005][1005];//原始地图 int dt[][2]= {{1,0},{-1,0},{0,1},{0,-1}};//方向 struct node { int x,y;//横纵坐标 }; node now,net; void bfs() { int f=0; queue<node>q; now.x=sx,now.y=sy; mp[now.x][now.y]='#';//这里走过 变'.'为'#'即可 q.push(now); while(!q.empty()) { now=q.front(); q.pop(); if(now.x==ex&&now.y==ey)//到达终点 { f=1; cout<<"YES"<<endl; break; } for(int i=0; i<4; i++) { net.x=now.x+dt[i][0]; net.y=now.y+dt[i][1]; if(net.x>=0&&net.x<n&&net.y>=0&&net.y<n&&mp[net.x][net.y]=='.') { q.push(net); mp[net.x][net.y]='#';//这里走过 变'.'为'#'即可 } } } if(f==0) { cout<<"NO"<<endl; return; } } int main() { cin>>T; while(T--) { cin>>n; for(int i=0; i<n; i++) for(int j=0; j<n; j++) cin>>mp[i][j]; cin>>sx>>sy>>ex>>ey; // cout<<mp[sx][sy]<<" "<<mp[ex][ey]<<endl; if(mp[sx][sy]=='#'||mp[ex][ey]=='#')//判断初始与结束位置 cout<<"NO"<<endl; else bfs(); } }