• 牛客寒假算法基础集训营4 C Applese 走迷宫


    链接:https://ac.nowcoder.com/acm/contest/330/C
    来源:牛客网

    精通程序设计的 Applese 双写了一个游戏。

    在这个游戏中,它被困在了一个 n×m迷宫


    在迷宫中,有一些方格是水池,只有当 Applese 处于水属性的时候才可以通过;有一些方格是岩浆,只有当 Applese 是火属性的时候可以通过;有一些方格是墙壁,无论如何都无法通过;另一些格子是空地(包括起点和终点),可以自由通过

    在一些空地上有神秘道具可以让 Applese 转换自己的属性(从水属性变为火属性或从火属性变为水属性,需要一个单位的时间)。

    已知 Applese 在一个单位的时间内可以朝四个方向行走一格,且开始处于水属性,位于空地的道具拾取后只能在该处立即使用(或者不使用),且可以多次使用。求它走出迷宫需要的最少时间

    开三维数组,vis[x][y][0/1]  然后模拟即可

    有一点不是太明白,判断条件有个vis未被访问,也就是一个点最多过两次????

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 int n,m;
     4 typedef pair<pair<int,int>, int> Node;
     5 const int maxn=110;
     6 char g[maxn][maxn];
     7 int vis[maxn][maxn][2];
     8 int des[4][2]={-1,0,0,-1,1,0,0,1};
     9 
    10 int bfs(pair<int,int> S,pair<int,int> T) {
    11     memset(vis,-1,sizeof(vis));
    12     queue<Node> q;
    13     q.push({S,0});
    14     vis[S.first][S.second][0]=0;
    15     while(!q.empty()) {
    16         Node tmp=q.front();
    17         q.pop();
    18         int x=tmp.first.first,y=tmp.first.second;
    19         bool p=tmp.second;
    20         for(int i=0;i<4;i++) {
    21             int nx=x+des[i][0];
    22             int ny=y+des[i][1];
    23             if(nx<0||nx>=n||ny<0||ny>=m) continue;
    24             if(~vis[nx][ny][p]) continue;
    25             if(g[nx][ny]=='#') continue;
    26             if(p&&g[nx][ny]=='~') continue;
    27             if(!p&&g[nx][ny]=='w') continue;
    28             vis[nx][ny][p]=vis[x][y][p]+1;
    29             pair<int,int> nxt={nx,ny};
    30             if(nxt==T) return vis[nx][ny][p];
    31             q.push({nxt,p});
    32         }
    33         if(g[x][y]=='@'&&vis[x][y][p^1]==-1) {
    34             vis[x][y][p^1]=vis[x][y][p]+1;
    35             q.push({tmp.first,p^1});
    36         }
    37     }
    38     return -1;
    39 }
    40 
    41 int main() {
    42     pair<int,int> S,T;
    43     scanf("%d%d",&n,&m);
    44     for(int i=0;i<n;i++) scanf("%s",g[i]);
    45     for(int i=0;i<n;i++) {
    46         for(int j=0;j<m;j++) {
    47             if(g[i][j]=='S') {
    48                 S={i,j};
    49             }
    50             else if(g[i][j]=='T') {
    51                 T={i,j};
    52             }
    53         }
    54     }
    55     int ans=bfs(S,T);
    56     printf("%d
    ",ans);
    57     return 0;
    58 }
  • 相关阅读:
    蓝翔杯子校内赛练习代码
    [蓝桥杯][算法训练VIP]猴子分苹果
    系统设计部分代码
    坐标离散化
    蒟蒻吃药计划-治疗系列 #round 1 机器分配+挖地雷
    蒟蒻吃药计划
    F小蒟蒻教你卡常
    最长不下降子序列
    最大子段和(DP)
    luogu P1216 (USACO1.5) Number Triangles
  • 原文地址:https://www.cnblogs.com/ACMerszl/p/10345214.html
Copyright © 2020-2023  润新知