• 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 }
  • 相关阅读:
    PYthon继承链(egg)的思考和实战
    C++不同类型变量参与运算时的规则
    qt通过QFileDialog获取文件路径&保存文件&选择文件夹
    visual studio 2015调试程序
    C++Primer第五版——书店程序实现
    git rm命令 & git reset和checkout区别
    git diff命令输出解释 & git checkout还原文件到特定版本
    Qt使用connect传参数的两种方式
    QFrame的setFrameStyle函数 && QPalette设置背景
    tr函数作用
  • 原文地址:https://www.cnblogs.com/AaronChang/p/12308553.html
Copyright © 2020-2023  润新知