1. 程式人生 > 實用技巧 >臨海天天快樂2020年暑假信奧競賽班參考程式碼

臨海天天快樂2020年暑假信奧競賽班參考程式碼

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\n";
		else cout<<"NO\n";
	}
	return 0;
}