1. 程式人生 > >Applese 走迷宮 BFS

Applese 走迷宮 BFS

else 地圖 data- 包括 維數 amp org weight tro

鏈接:https://ac.nowcoder.com/acm/contest/330/C
來源:牛客網

精通程序設計的 Applese 雙寫了一個遊戲。

在這個遊戲中,它被困在了一個 n×m鏈接:它想要逃出這個迷宮。
在迷宮中,有一些方格是水池,只有當 Applese 處於水屬性的時候才可以通過;有一些方格是巖漿,只有當 Applese 是火屬性的時候可以通過;有一些方格是墻壁,無論如何都無法通過;另一些格子是空地(包括起點和終點),可以自由通過。
在一些空地上有神秘道具可以讓 Applese 轉換自己的屬性(從水屬性變為火屬性或從火屬性變為水屬性,需要一個單位的時間)。

已知 Applese 在一個單位的時間內可以朝四個方向行走一格,且開始處於水屬性,位於空地的道具拾取後只能在該處立即使用(或者不使用),且可以多次使用。求它走出迷宮需要的最少時間。

輸入描述:

第一行兩個正整數 n, m (1<=n,m<=100)表示迷宮的大小。
接下來 n 行,每行長度為 m 的字符串。描述地圖。
其中 ‘S‘ 表示起點,‘T‘ 表示終點,‘.‘ 表示空地,‘w‘表示巖漿,‘~‘表示水池,‘@‘ 表示道具,‘#‘表示障礙。
保證地圖中的起點和終點只有一個,道具都位於空地。

輸出描述:

輸出一個整數,表示 Applese 走出迷宮的最短時間。特別地,如果 Applese 走不出迷宮,輸出 "-1"。

輸入

5 5
.w@..
.S#..
~w#..
.w..~
@w.~T

輸出

18
題解
這題可以套bfs的模板,不過水火兩種狀態要分開 因此我開了一個三維數組 同時也使用了異或的一些小技巧,比如一個數異或1得到它的相鄰數
代碼
#include <bits/stdc++.h>
using namespace std;
struct node{
    int x, y, s;
    node(int xx, int yy, int zz)
    {
        x = xx; 
        y = yy;
        s = zz; //水火屬性 0代表水 1代表火
    }
};
queue<node> que;
int sx, sy, gx, gy,n,m; //起點 終點坐標 
char mp[105][105]; // ‘S‘ 表示起點,‘T‘ 表示終點,‘.‘ 表示空地,‘w‘表示巖漿,‘~‘表示水池,‘@‘ 表示道具,‘#‘表示障礙。
int d[105][105][2];//記錄時間 0代表水屬性 1代表火屬性 int dx[4] = { 1, -1, 0, 0 }, dy[4] = { 0, 0, 1, -1 }; int bfs() { memset(d, -1, sizeof(d)); //-1代表未訪問 que.push(node(sx, sy, 0)); d[sx][sy][0] = 0; //水屬性 並且時間為0 while (!que.empty()) { node cur = que.front(); que.pop(); int state = cur.s,x=cur.x,y=cur.y; if (x == gx&&y == gy) { return d[gx][gy][state]; //答案 } if (mp[x][y] == @&&d[x][y][state^1]== -1) //同樣判斷改變後的狀態有沒有被訪問 { d[x][y][state ^ 1] = d[x][y][state]+1; que.push(node(x, y, state ^ 1)); //異或改變屬性 } for (int i = 0; i < 4; i++) { int nx = x + dx[i], ny = y + dy[i]; if (nx <= 0 || nx>n || ny <= 0 || ny > m) continue;//越界 if (~d[nx][ny][state]) continue; //已訪問 if (mp[nx][ny] == #) continue; //阻擋 if ((state&&mp[nx][ny] == ~) || (!state&&mp[nx][ny] == w)) continue; //屬性不相容 que.push(node(nx, ny, state)); d[nx][ny][state] = d[x][y][state] + 1; } } return -1; //到不了終點 } int main() { cin >> n >> m; getchar(); for (int i = 1; i <= n; i++) { for (int j = 1; j <= m; j++) { cin >> mp[i][j]; if (mp[i][j] == S) sx = i, sy = j; else if (mp[i][j] == T) gx = i, gy = j; } getchar(); } cout << bfs(); return 0; }

好長時間不寫了,沒有寫下去的動力




Applese 走迷宮 BFS