https://ac.nowcoder.com/acm/problem/201961
预处理出僵尸走的路径,僵尸走的周期长度应该为2k-2,在普通的bfs基础上加上一维表示时间,从当前位置x,y和和时间t去更新新的x,y和时间t+1,vis数组也是三维的,等于多一层状态进行表示dis数组,把每个状态加入队列,直到到达终点或者队列为空,即可求出最佳答案。
1 #include<bits/stdc++.h> 2 using namespace std; 3 typedef long long ll; 4 struct node{ 5 int x,y,t; 6 }; 7 int dx[4] = {0,0,-1,1}; 8 int dy[4] = {-1,1,0,0}; 9 int vis[505][505][22]; 10 int dis[505][505][22]; 11 char mp[505][505][22]; 12 int n,m,p,k,sx,sy,ex,ey; 13 void init(){ 14 for(int i = 0;i<p;i++){ 15 int x,y;string s; 16 cin>>x>>y; 17 cin>>s; 18 if(s[0] == 'R'){ 19 for(int i = 0;i<k;i++){ 20 mp[x][y+i][i] = '*'; 21 } 22 int yy = y + k - 1; 23 for(int i = 1;i<k;i++){ 24 mp[x][yy-i][k+i-1] = '*'; 25 } 26 } 27 if(s[0] == 'L'){ 28 for(int i = 0;i<k;i++){ 29 mp[x][y-i][i] = '*'; 30 } 31 int yy = y - k + 1; 32 for(int i = 1;i<k;i++){ 33 mp[x][yy+i][k+i-1] = '*'; 34 } 35 } 36 if(s[0] == 'U'){ 37 for(int i = 0;i<k;i++){ 38 mp[x-i][y][i] = '*'; 39 } 40 int xx = x - k + 1; 41 for(int i = 1;i<k;i++){ 42 mp[xx+i][y][k+i-1] = '*'; 43 } 44 } 45 if(s[0] == 'D'){ 46 for(int i = 0;i<k;i++){ 47 mp[x+i][y][i] = '*'; 48 } 49 int xx = x + k - 1; 50 for(int i = 1;i<k;i++){ 51 mp[xx-i][y][k+i-1] = '*'; 52 } 53 } 54 } 55 } 56 int bfs(){ 57 queue<node> q; 58 q.push({sx,sy,0}); 59 while(!q.empty()){ 60 node cur = q.front(); 61 q.pop(); 62 int tx = cur.x ,ty = cur.y ,t = cur.t; 63 if(tx == ex && ty == ey) return t; 64 for(int i = 0;i<4;i++){ 65 int xx = tx+dx[i],yy = ty + dy[i],zz = (t+1)%(2*k-2); 66 if(vis[xx][yy][zz]) continue; 67 if(xx>=1&&xx<=n&&yy>=1&&yy<=m&&mp[xx][yy][0]!='&'&&mp[xx][yy][zz]!='*'){ 68 vis[xx][yy][zz] = 1; 69 q.push({xx,yy,t+1}); 70 } 71 } 72 } 73 return -1; 74 } 75 int main(){ 76 cin>>n>>m>>p>>k; 77 for(int i = 1;i<=n;i++) { 78 string s;cin>>s; 79 for(int j = 1;j<=m;j++){ 80 mp[i][j][0] = s[j-1]; 81 if(mp[i][j][0] == 'L') sx = i,sy = j,vis[i][j][0] = 1; 82 if(mp[i][j][0] == 'A') ex = i,ey = j; 83 } 84 } 85 init(); 86 int ans = bfs(); 87 if(ans == -1) cout<<"Oh no"; 88 else cout<<ans; 89 return 0; 90 }