浣熊市下水道 Gym - 102072K (bfs)
多开一维记录当前僵尸的状况
k<10 所以僵尸的状况最多为 k*2-2 18种
每次到僵尸的路径上时,判断一下是否可行即可
这里我在记录僵尸路径 直接对应了一下僵尸的状况;
#include<bits/stdc++.h> using namespace std; #define ll long long #define inf 0x3f3f3f3f #define mem(a,b) memset(a,b,sizeof(a)) const int maxn=505; int vis[505][505][20]; int nmap[505][505]; int n,m,p,k,mod; int dx[4]={0,0,-1,1},dy[4]={1,-1,0,0}; int ex,ey,sx,sy; struct node{ int x,y,dep; }; void work() { int x,y; string s; cin>>x>>y>>s; if(s=="UP") { for(int i=0;i<=k;i++) nmap[x-i][y]=i+1; } if(s=="DOWN") { for(int i=0;i<=k;i++) nmap[x+i][y]=i+1; } if(s=="LEFT") { for(int i=0;i<=k;i++) nmap[x][y-i]=i+1; } if(s=="RIGHT") { for(int i=0;i<=k;i++) nmap[x][y+i]=i+1; } } int cheek(int x,int y,int dep) { if(nmap[x][y]==-1) return 0; if(nmap[x][y]==0) return 1; dep%=mod; if(dep==0) dep=mod; if(nmap[x][y]==dep||nmap[x][y]==2*(k+1)-dep) return 0; return 1; } int bfs(int x,int y) { int dep=1,ans=inf; queue<node>q; vis[x][y][1]=1; q.push((node){x,y,1}); while(!q.empty()) { x=q.front().x; y=q.front().y; dep=q.front().dep; q.pop(); if(x==ex&&y==ey) { ans=dep; break ; } for(int i=0;i<4;i++) { int xx=x+dx[i],yy=y+dy[i]; if(xx>=1&&xx<=n&&yy>=1&&yy<=m&&cheek(xx,yy,dep+1)&&!vis[xx][yy][(dep+1)%mod]) { q.push((node){xx,yy,dep+1}); vis[xx][yy][(dep+1)%mod]=1; } } } return ans; } int main() { scanf("%d%d%d%d",&n,&m,&p,&k); mod=k*2-2; k--; for(int i=1;i<=n;i++) { for(int j=1;j<=m;j++) { char ch; cin>>ch; if(ch=='&') nmap[i][j]=-1; if(ch=='A') ex=i,ey=j; if(ch=='L') sx=i,sy=j; } } for(int i=1;i<=p;i++) work(); int ans=bfs(sx,sy); if(ans==inf) cout<<"You are Dead!\n"; else cout<<ans-1<<"\n"; return 0; }