版权声明:本文为博主原创文章,转载请注明出处( • ̀ω•́ )✧ https://blog.csdn.net/wangws_sb/article/details/86572478
典型的广搜题,但是有坑,在某个方向走的时候要一直走到头,不然的话可能会出现多转弯的情况,主要就是保证从起始点到某一点的转弯次数是最小的
AC代码:
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <string>
#include <cmath>
#include <queue>
#include <stack>
#include <vector>
#include <map>
#include <set>
using namespace std;
#define io ios::sync_with_stdio(0),cin.tie(0)
#define ms(arr) memset(arr,0,sizeof(arr))
#define inf 0x3f3f3f
#define fin freopen("in.txt", "r", stdin)
#define fout freopen("out.txt", "w", stdout)
typedef long long ll;
typedef unsigned long long ULL;
const int mod=1e9+7;
const int N=110;
struct node
{
int x,y;
int d;//拐弯次数
};
int t,n,m,k,sx,sy,ex,ey;
char arr[N][N];
int vis[N][N];
queue <node> q;
int dx[]={-1,0,1,0};
int dy[]={0,-1,0,1};
int main()
{
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",&arr[i][j]);
}
getchar();
}
scanf("%d%d%d%d%d",&k,&sy,&sx,&ey,&ex);
while(!q.empty())
{
q.pop();
}
memset(vis,0,sizeof(vis));
vis[sx][sy]=1;
bool judge=false;
node now;
now.x=sx;
now.y=sy;
now.d=-1;
q.push(now);
while(!q.empty())
{
now=q.front();
q.pop();
if(now.x==ex&&now.y==ey)
{
judge=true;
break;
}
for(int i=0;i<4;i++)
{
node nxt;
nxt.x=now.x+dx[i];
nxt.y=now.y+dy[i];
while(arr[nxt.x][nxt.y]=='.'&&nxt.x>=1&&nxt.x<=m&&nxt.y>=1&&nxt.y<=n)
{
if(vis[nxt.x][nxt.y]==0)
{
vis[nxt.x][nxt.y]=1;
nxt.d=now.d+1;
if(nxt.d<=k) q.push(nxt);
}
nxt.x=nxt.x+dx[i];
nxt.y=nxt.y+dy[i];
}
}
}
if(judge) printf("yes\n");
else printf("no\n");
}
return 0;
}