给定一个m × n (m行, n列)的迷宫,迷宫中有两个位置,gloria想从迷宫的一个位置走到另外一个位置,当然迷宫中有些地方是空地,gloria可以穿越,有些地方是障碍,她必须绕行,从迷宫的一个位置,只能走到与它相邻的4个位置中,当然在行走过程中,gloria不能走到迷宫外面去。令人头痛的是,gloria是个没什么方向感的人,因此,她在行走过程中,不能转太多弯了,否则她会晕倒的。我们假定给定的两个位置都是空地,初始时,gloria所面向的方向未定,她可以选择4个方向的任何一个出发,而不算成一次转弯。gloria能从一个位置走到另外一个位置吗?
第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对应行。
2 5 5 ...** *.**. ..... ..... *.... 1 1 1 1 3 5 5 ...** *.**. ..... ..... *.... 2 1 1 1 3
noyes
思路:广搜的时候,一个方向直到走不动为止,再换方向。
#include<iostream> #include<cstdio> #include<queue> #include<cstring> using namespace std; struct node{ int x; int y; int stemp;//记录转弯的方向 }u,e; int m,n,sx,sy,ex,ey,k; char Map[105][105]; int book[105][105]; int text(node a){ if(a.x<1 || a.x>n || a.y<1 || a.y>m) return 0; if(Map[a.x][a.y]=='*') return 0; return 1; } void BFS(){ int i,f; queue<node>q; while(!q.empty()) q.pop(); u.x=sx; u.y=sy; u.stemp=-1;//初始步数为-1,可以模拟一下 就明白了,第一次走的时候步数为0 q.push(u); f=0; // printf("R x=%d y=%d stemp=%d\n",u.x,u.y,u.stemp); while(!q.empty()){ u=q.front(); q.pop(); // printf("C x=%d y=%d stemp=%d\n",u.x,u.y,u.stemp); // if(u.stemp>k) break; if(u.x==ex && u.y==ey && u.stemp<=k){ printf("yes\n"); f=1; break; } e.x=u.x;//向右 for(i=u.y+1;i<=m && Map[e.x][i]!='*';i++){ e.y=i; e.stemp=u.stemp+1; if(text(e)==1 && book[e.x][e.y]==0){ q.push(e); book[e.x][e.y]=1; // printf("R x=%d y=%d stemp=%d\n",e.x,e.y,e.stemp); } } e.y=u.y;//向下 for(i=u.x+1;i<=n && Map[i][e.y]!='*';i++){ e.x=i; e.stemp=u.stemp+1; if(text(e)==1 && book[e.x][e.y]==0){ q.push(e); book[e.x][e.y]=1; // printf("R x=%d y=%d stemp=%d\n",e.x,e.y,e.stemp); } } e.x=u.x; //向左 for(i=u.y-1;i>0 && Map[e.x][i]!='*';i--){ e.y=i; e.stemp=u.stemp+1; if(text(e)==1 && book[e.x][e.y]==0){ q.push(e); book[e.x][e.y]=1; // printf("R x=%d y=%d stemp=%d\n",e.x,e.y,e.stemp); } } e.y=u.y;//向上 for(i=u.x-1;i>0 && Map[i][e.y]!='*';i--){ e.x=i; e.stemp=u.stemp+1; if(text(e)==1 && book[e.x][e.y]==0){ q.push(e); book[e.x][e.y]=1; // printf("R x=%d y=%d stemp=%d\n",e.x,e.y,e.stemp); } } } if(f==0) printf("no\n"); } int main(){ int t,i,j; scanf("%d",&t); while(t--){ // printf("t=%d\n",t); scanf("%d%d",&n,&m); // printf("n=%d m=%d\n",n,m); getchar(); for(i=1;i<=n;i++){ for(j=1;j<=m;j++){ scanf("%c",&Map[i][j]); } getchar(); } scanf("%d%d%d%d%d",&k,&sy,&sx,&ey,&ex); // printf("ok\n"); memset(book,0,sizeof(book)); BFS(); } }