3305: Hero In Maze II
利用广搜去直接找到最小步数,我们可以一条路走到黑,这样每个点都是最小转弯次数
#include<bits/stdc++.h>
using namespace std;
int n,m,t;
int vis[105][105];
char s[105][105];
int dir[4][2]={
-1,0,
0,-1,
0,1,
1,0
};
struct T
{
int x,y,step,turn;
}a[10000];
int ans;
void bfs(int sx,int sy)
{
int tot=0,cur=0;
a[tot++]={sx,sy,-1,4};
vis[sx][sy]=1;
while(cur<tot)
{
if(a[cur].step>t)return;
if(s[a[cur].x][a[cur].y]=='P')
{
ans=a[cur].step;
return;
}
for(int i=0;i<4;i++)
{
for(int j=1;;j++)
{
int tx=a[cur].x+dir[i][0]*j;
int ty=a[cur].y+dir[i][1]*j;
if(tx<0||ty<0||tx>=n||ty>=m)break;
if(vis[tx][ty]||s[tx][ty]=='*')break;
if(a[cur].turn!=i)a[tot++]={tx,ty,a[cur].step+1,i};
else a[tot++]={tx,ty,a[cur].step,i};
vis[tx][ty]=1;
}
}
cur++;
}
}
int main()
{
int T;
cin>>T;
while(T--)
{
memset(vis,0,sizeof(vis));
cin>>n>>m>>t;
ans=-1;
for(int i=0;i<n;i++)cin>>s[i];
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
if(s[i][j]=='S')bfs(i,j);
}
if(ans<=t&&ans!=-1)cout<<"YES
";
else cout<<"NO
";
}
return 0;
}