原题链接:http://acm.hdu.edu.cn/showproblem.php?pid=1728
普通迷宫增加转弯次数,不知道怎么限制转弯次数,只好按照转一个方向增加一次转弯一搜到底了。。
#include <iostream> //78ms
#include <queue>
#include <cstring>
using namespace std;
int n,m;
const int INF = 1e5+666;
const int AX = 300;
char a[AX][AX];
struct Node
{
int x;
int y;
int k; //记录转弯次数
}pos,q;
int vis[110][110];
int dir[4][2]={
{0,1},
{1,0},
{0,-1},
{-1,0},
};
int bfs(int start_x,int start_y,int end_x,int end_y,int sum){
queue<Node>que;
pos.k = -1; //第一次转弯不算所以从-1开始,这个处理是看的别人的 = =。
pos.x = start_x;pos.y = start_y;
vis[pos.x][pos.y] = 1;
que.push(pos);
while(!que.empty())
{
pos=que.front();
if(pos.k>=sum)break;
que.pop();
for(int i=0;i<4;i++)
{
q.x=pos.x+dir[i][0];
q.y=pos.y+dir[i][1];
q.k=pos.k+1; //从一个点以一个方向搜到不能走
while(a[q.x][q.y]=='.')
{
if(q.x==end_x&&q.y==end_y) //到终点就ok啦
{
return 1;
}
if(vis[q.x][q.y]==0) //没走过又不标记就ME啦
{
vis[q.x][q.y]=1;
que.push(q);
}
q.x+=dir[i][0]; //一搜到底+++++(i是不变的,所以就是按原来的方向走,转弯不存在的)
q.y+=dir[i][1];
}
}
}
return 0;
}
int main(){
int T;
cin>>T;
while(T--){
memset(a,0,sizeof(a));
memset(vis,0,sizeof(vis));
cin>>n>>m;
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
cin>>a[i][j];
}
}
int s_x,s_y,e_x,e_y;
int sun;
cin>>sun>>s_y>>s_x>>e_y>>e_x; //输入是反的哦
s_y--;s_x--;e_y--,e_x--; //从0开始-----
if(bfs(s_x,s_y,e_x,e_y,sun)){
cout<<"yes"<<endl;
}else{
cout<<"no"<<endl;
}
}
return 0;
}