臨海天天快樂2020年暑假信奧競賽班參考程式碼
阿新 • • 發佈:2020-08-09
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; }