给定一个m × n (m行, n列)的迷宫,迷宫中有两个位置,gloria想从迷宫的一个位置走到另外一个位置,当然迷宫中有些地方是空地,gloria可以穿越,有些地方是障碍,她必须绕行,从迷宫的一个位置,只能走到与它相邻的4个位置中,当然在行走过程中,gloria不能走到迷宫外面去。令人头痛的是,gloria是个没什么方向感的人,因此,她在行走过程中,不能转太多弯了,否则她会晕倒的。我们假定给定的两个位置都是空地,初始时,gloria所面向的方向未定,她可以选择4个方向的任何一个出发,而不算成一次转弯。gloria能从一个位置走到另外一个位置吗?
Input 第1行为一个整数t (1 ≤ t ≤ 100),表示测试数据的个数,接下来为t组测试数据,每组测试数据中,
第1行为两个整数m, n (1 ≤ m, n ≤ 100),分别表示迷宫的行数和列数,接下来m行,每行包括n个字符,其中字符'.'表示该位置为空地,字符'*'表示该位置为障碍,输入数据中只有这两种字符,每组测试数据的最后一行为5个整数k, x 1 , y 1 , x 2 , y 2 (1 ≤ k ≤ 10, 1 ≤ x 1 , x 2 ≤ n, 1 ≤ y 1 , y 2 ≤ m),其中k表示gloria最多能转的弯数,(x 1 , y 1 ), (x 2 , y 2 )表示两个位置,其中x 1 ,x 2 对应列,y 1 , y 2 对应行。
Output 每组测试数据对应为一行,若gloria能从一个位置走到另外一个位置,输出“yes”,否则输出“no”。Sample Input
2 5 5 ...** *.**. ..... ..... *.... 1 1 1 1 3 5 5 ...** *.**. ..... ..... *.... 2 1 1 1 3Sample Output
no yes
走迷宫的题一下就想到是搜索来做,但是这个题用bfs来做的时候,只要当前方向能走,就先一直走到头,并把经过的点加到队列中,让我对bfs有了新的理解。要注意的是,题目输入的x1,x2是代表列的,所以读的时候x和y颠倒一下。
当时做的时候把数据读入顺序写错了,以为k是最后一个,wa了无数发,哭死。
下面放代码吧:
- #include <bits/stdc++.h>
- #include <cstring>
- using namespace std;
- char mp[1005][1005];
- struct node
- {
- int x,y;
- int tms;
- };
- int to[4][2]={{0,1},{1,0},{0,-1},{-1,0}};
- int vis[1005][1005];
- int main()
- {
- int T,n,m;
- int X1,Y1,X2,Y2,k;
- scanf("%d",&T);
- while(T--)
- {
- memset(vis,0,sizeof(vis));
- int flag=0;
- scanf("%d%d",&n,&m);
- for(int i=0;i<n;i++)
- {
- scanf("%s",mp[i]);
- }
- scanf("%d%d%d%d%d",&k,&Y1,&X1,&Y2,&X2);
- if(X1==X2&&Y1==Y2)
- {
- cout<<"yes"<<endl;
- continue;
- }
- X1--;X2--;Y1--;Y2--;
- vis[X1][Y1]=1;
- queue <node> que;
- node ss;
- ss.x=X1;
- ss.y=Y1;
- ss.tms=-1;
- que.push(ss);
- while(!que.empty())
- {
- node temp=que.front();
- que.pop();
- for(int i=0;i<4;i++)
- {
- node nw;
- nw=temp;
- nw.x+=to[i][0];
- nw.y+=to[i][1];
- while(nw.x>=0&&nw.x<n&&nw.y>=0&&nw.y<m&&mp[nw.x][nw.y]=='.')
- {
- if(vis[nw.x][nw.y]==0)
- {
- vis[nw.x][nw.y]=1;
- nw.tms=temp.tms+1;
- if(nw.x==X2&&nw.y==Y2&&nw.tms<=k)
- {
- flag=1;
- break;
- }
- que.push(nw);
- }
- nw.x+=to[i][0];
- nw.y+=to[i][1];
- }
- if(flag)
- break;
- }
- if(flag)
- break;
- }
- if(flag)
- cout<<"yes"<<endl;
- else
- cout<<"no"<<endl;
- }
- return 0;
- }