#include<stdio.h>
#include<string.h>
#include<iostream>
#include<queue>
using namespace std;
#define inf 0xffffff
int n,m;
int k,ex,ey,sx,sy;
bool flag;
char maze[110][110];
int dir[4][2]={-1,0,1,0,0,1,0,-1};
int wan[110][110];
struct node{int x,y;};
queue<node>q;
void bfs(){
for(int i=0;i<m;i++)
for(int j=0;j<n;j++)
wan[i][j]=inf;
node ft,tp;
ft.x=sx,ft.y=sy;
wan[ft.x][ft.y]=-1;
while(!q.empty()) q.pop();
q.push(ft);
while(!q.empty()){
ft=q.front();
q.pop();
if(ft.x==ex&&ft.y==ey&&wan[ft.x][ft.y]<=k){
puts("yes");
return ;
}
for(int i=0;i<4;i++){
tp.x=ft.x+dir[i][0];
tp.y=ft.y+dir[i][1];
while(tp.x>=0&&tp.x<m&&tp.y>=0&&tp.y<n)
{
if(maze[tp.x][tp.y]=='*')
break;
if(wan[tp.x][tp.y]<wan[ft.x][ft.y]+1)//因为最开始初始状态为-1,如果现在的转弯次数比ft时小,说明有其他的路径,这里作为维护作用使用
break;
wan[tp.x][tp.y]=wan[ft.x][ft.y]+1;
if(wan[tp.x][tp.y]>k)
break;
if(wan[tp.x][tp.y]==k&&tp.x != ex && tp.y != ey)
break;
q.push(tp);
tp.x+=dir[i][0];
tp.y+=dir[i][1];//一条道搜索到底
}
}
}
puts("no");
}
int main()
{
int t ;
scanf("%d",&t);
while(t--){
scanf("%d%d",&m,&n);
for(int i=0;i<m;i++)//注意m,n顺序
scanf("%s",&maze[i]);
scanf("%d%d%d%d%d",&k,&sy,&sx,&ey,&ex);//坐标顺序
sx--,sy--,ex--,ey--;
bfs();
}
return 0;
}
HDU1728---逃离迷宫
最新推荐文章于 2019-04-23 00:52:19 发布