2020牛客寒假算法基础集训营5 G.街机争霸 (bfs)

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 }

 

posted @ 2020-02-14 18:57  AaronChang  阅读(177)  评论(0编辑  收藏  举报