# r802. B. The Phase-Swapped Labyrinth ## 提示 1. 起點在(0,0) 終點在(n-1,m-1) 2. `.` phase 0可以走 3. `#` phase 1可以走 4. 題目的```overlapping``` 表示遇到`S`之後會同步進行兩種Phase 5. 實作即可(bfs) # 程式碼 ```cpp= #include <bits/stdc++.h> using namespace std; #define int long long #define idonthavegirlfriend ios::sync_with_stdio(0),cin.tie(0); #define pb push_back #define yn(a) (a?"Yes\n":"No\n") signed main(){ idonthavegirlfriend int n,m; cin>>n>>m; vector<string> mp(n); for(auto &i:mp) cin>>i; /*for(auto &i:mp){ for(auto &c:i){ c=(c=='.'?'0':'1'); } }*/ vector<vector<vector<int>>> dis(n,vector<vector<int>>(m,vector<int>(2,1e9))); queue<tuple<int,int,int>> q; if(mp[0][0]=='.'){ q.push({0,0,0}); dis[0][0][0]=0; } if(mp[0][0]=='S'){ q.push({0,0,1}); dis[0][0][1]=0; q.push({0,0,0}); dis[0][0][0]=0; } /*if(mp[0][0]=='#'){ q.push({0,0,1}); dis[0][0][1]=0; }*/ int dx[4] = {0, 0, 1, -1}; int dy[4] = {1, -1, 0, 0}; #define check(a,b) (((a)<n) and ((a)>=0) and ((b)<m) and ((b)>=0)) while(!q.empty()){ auto [x,y,p]=q.front();q.pop(); for(int i=0;i<4;i++){ int nx=x+dx[i],ny=y+dy[i]; if(!(check(nx,ny))) continue; int nxtp=p; if(mp[nx][ny]=='S' or mp[nx][ny]=='s'){ nxtp=p^1; } /*if(dis[nx][ny][nxtp]!=1e9){ continue; }*/ if(mp[nx][ny]=='S' or mp[nx][ny]=='s'){ if (dis[x][y][p]+1<dis[nx][ny][nxtp]){ dis[nx][ny][nxtp]=dis[nx][ny][p]=dis[x][y][p]+1; q.push({nx,ny,nxtp}); q.push({nx,ny,p}); } } else{ if(p==0){ if(mp[nx][ny]=='.'){ if (dis[x][y][p]+1<dis[nx][ny][nxtp]){ dis[nx][ny][nxtp]=dis[x][y][p]+1; q.push({nx,ny,nxtp}); } } } else{ if(mp[nx][ny]=='#'){ if (dis[x][y][p]+1<dis[nx][ny][nxtp]){ dis[nx][ny][nxtp]=dis[x][y][p]+1; q.push({nx,ny,nxtp}); } } } } } } int ans=1e9; ans=min(dis[n-1][m-1][0],dis[n-1][m-1][1]); cout<<(ans==1e9?-1:ans); } ```