这个题我是用bfs写,想法是把他每一次转弯后可以走到的点都入队(不用再次转弯就可以到的点)
然后看每个点能不能再次转弯,可以的话就再次转弯记下直线上的点,一直到找到这个点或者转弯次数用完。
还有题目的行和列与平常是不一样的 有点坑
#include<bits/stdc++.h>
using namespace std;
struct node
{
int x,y,step;
};
int n,m,k,ex,ey,sx,sy,vis[105][105];
char a[105][105];
int x[]= {1,-1,0,0};
int y[]= {0,0,1,-1};//方向
int bfs()
{
node w;
w.step=-1;
w.x=sx;
w.y=sy;
memset(vis,0,sizeof(vis));
vis[sx][sy]=1;//初始化
queue<node>q;
q.push(w);//入队
node f,e;
while(!q.empty())
{
f=q.front();
q.pop();//出队第一个
if(f.x==ex&&f.y==ey&&f.step<=k)
return 1;//满足条件就结束(即找到了末尾的点) 返回一个1
e.step=f.step+1;//(转向加一)
for(int i=0; i<4; i++)//往四个方向转
{
int xx=f.x+x[i];
int yy=f.y+y[i];
while(xx>=1&&xx<=n&&yy>=1&&yy<=m&&a[xx][yy]!='*')//不超边界 不碰到‘*’ 那么这一条线都可以直接到
{
if(vis[xx][yy]==0)//没用过
{
vis[xx][yy]=1;
e.x=xx;
e.y=yy;
q.push(e);//入栈
}
xx+=x[i];
yy+=y[i];//不转弯的下一个点
}
}
}
return 0;//最后没找到末尾的点 返回一个0
}
int main()
{
int t;
cin>>t;
while(t--)
{
cin>>n>>m;
for(int i=1; i<=n; i++)
for(int j=1; j<=m; j++)
cin>>a[i][j];
cin>>k>>sy>>sx>>ey>>ex;
if(bfs()) cout<<"yes"<<endl;
else cout<<"no"<<endl;
}
return 0;
}