题目链接:点击打开链接
#include
#include
#include
#include
#include
using namespace std;
int m,n;
int x1,y1,x2,y2,k;
int bj[105][105];///改数组用来存在该位置转弯的次数
int dir[4][2]={{0,1},{0,-1},{1,0},{-1,0}};///方向
char map[105][105];///存图
struct book{/// 记录该点的转弯次数
int xx,yy,ans;
};
void dfs()
{
queueq;
memset(bj,-1,sizeof(bj));///初始化将 bj 数组刷为 -1
book v,w;
v.xx=x1;
v.yy=y1;
v.ans=-1;///将初始位置设为 -1 是因为第一次不管往哪走都不算转弯
bj[x1][y1]=0;
q.push(v);
while(!q.empty())
{
v=q.front();
q.pop();
if(v.ans>k)///如果该点转弯次数大于 k 次,则再走别的路
continue;
if(v.xx==x2&&v.yy==y2)
{
printf("yes\n");///如果找到目的地,就输出yes
return;
}
for(int i=0;i<4;i++)
{
w.xx=v.xx+dir[i][0];
w.yy=v.yy+dir[i][1];
while(w.xx>0&&w.yy>0&&w.xx<=m&&w.yy<=n&&map[w.xx][w.yy]!='*')///将该方向上能走的点都搜完
{
if(bj[w.xx][w.yy]==-1)///如果该点没有走过
{
w.ans=v.ans+1;
bj[w.xx][w.yy]=w.ans;
q.push(w);
}
w.xx+=dir[i][0];
w.yy+=dir[i][1];
}
}
}
printf("no\n");
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
scanf("%d %d",&m,&n);
getchar();
for(int i=1;i<=m;i++)
{
for(int j=1;j<=n;j++)
{
scanf("%c",&map[i][j]);
}
getchar();
}
scanf("%d %d %d %d %d",&k,&y1,&x1,&y2,&x2);
if(map[x1][y1]=='*'||map[x2][y2]=='*')///如果起始点或目的地有一个是阻碍,则不用搜了
{
printf("no\n");
continue;
}
dfs();
}
return 0;
}