第一次不算转弯所以为-1。搜索题大量wa啊。注意xy
#include<stdio.h>
#include<string.h>
#include<queue>
using namespace std;
const int inf = 0x3fffffff;
const int maxl = 101;
char map[maxl][maxl];
int n,m,x1,x2,y1,y2;
int k;
int wan[maxl][maxl];
int x_move[4] = {-1, 0, 1, 0};
int y_move[4] = {0, 1, 0, -1};
struct node{
int x,y;
};
int bfs()
{
int i;
int j;
for(i=0;i<m;i++)
for(j=0;j<n;j++)
wan[i][j]=inf;
queue<node> q;
node now,next;
now.x=x1;
now.y=y1;
wan[now.x][now.y]=-1;
q.push(now);
while(!q.empty())
{
now=q.front();
q.pop();
if(now.x==x2&&now.y==y2)
{
return wan[now.x][now.y];
}
for(i=0;i<4;i++)
{
next.x=now.x+x_move[i];
next.y=now.y+y_move[i];
while(!(next.x<0||next.y<0||next.x>=m||next.y>=n))
{
if(map[next.x][next.y]=='*')
break;
if(wan[next.x][next.y]<wan[now.x][now.y]+1)
break;
wan[next.x][next.y]=wan[now.x][now.y]+1;
if(wan[next.x][next.y]>k)
break;
if(wan[next.x][next.y]==k&&next.x!=x2&&next.y!=y2)
break;
q.push(next);
next.x+=x_move[i];
next.y+=y_move[i];
}
}
}
return 999999;
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&m,&n);
for(int i=0;i<m;i++)
scanf("%s",map[i]);
scanf("%d%d%d%d%d",&k,&y1,&x1,&y2,&x2);
y1--;x1--;x2--;y2--;
if(bfs()<=k)
{
printf("yes\n");
}
else
printf("no\n");
}
}