1. 程式人生 > 其它 >hduoj1253勝利大逃亡

hduoj1253勝利大逃亡

題目連結:http://acm.hdu.edu.cn/showproblem.php?pid=1253

首次見識三維bfs的第一題,有必要記錄一下;

題目思路:

和二維bfs差不多,需要注意的是多開一個z的同時所有的座標都要按三維座標運算;

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 bool vis[50][50][50];
 4 int mapp[50][50][50];//儲存立方體資訊
 5 struct node {//
 6     int x, y, z;
 7     int minn;
 8 };
 9 queue<node> Q;//
佇列中的元素為狀態 10 int dir[6][3] = {//座標變換陣列,由座標擴充套件得到的新座標均可通過(x+go[i][0],y+go[i][1],z+go[i][2]) 11 1,0,0, 12 -1,0,0, 13 0,1,0, 14 0,-1,0, 15 0,0,1, 16 0,0,-1 17 }; 18 int BFS(int a, int b, int c) {//廣度優先搜尋 19 memset(vis,0,sizeof(vis)); 20 queue<node> Q;//佇列中的元素為狀態queue<node> Q;
//佇列中的元素為狀態 21 vis[0][0][0] = true; 22 node now; 23 now.minn = now.y = now.x = now.z = 0; 24 Q.push(now); 25 while (!Q.empty()) {//當佇列中仍有元素可以擴充套件時迴圈 26 now = Q.front();//得到隊頭狀態 27 Q.pop();//從佇列彈出隊頭狀態 28 if (now.x == a - 1 && now.y == b - 1 && now.z == c - 1
) 29 return now.minn;//若改座標為終點,直接返回其耗時 30 for (int i = 0; i < 6; i++) {//依次擴充套件其六個相鄰節點 31 int nx = now.x + dir[i][0]; 32 int ny = now.y + dir[i][1]; 33 int nz = now.z + dir[i][2]; 34 if (nx < 0 || nx >= a || ny < 0 || ny >= b || nz < 0 || nz >= c) continue; 35 if (vis[nx][ny][nz] == 1) continue;//該位置為牆,則丟棄 36 if (mapp[nx][ny][nz] == 1) continue;//包含該位置的狀態已經被得到,丟棄 37 node tmp;//新狀態 38 tmp.x = nx; 39 tmp.y = ny; 40 tmp.z = nz;//新狀態包含的座標 41 tmp.minn = now.minn + 1;//新狀態的耗時 42 vis[tmp.x][tmp.y][tmp.z] = true;//標記該座標 43 Q.push(tmp);//將該狀態放入佇列 44 } 45 } 46 return -1;//所有狀態被查詢完後,仍得不到所需座標,則返回-1 47 } 48 int main() { 49 int T; 50 scanf("%d", &T); 51 while (T--) { 52 int a, b, c, t; 53 scanf("%d%d%d%d", &a, &b, &c, &t);//輸入 54 for (int i = 0; i < a; i++) { 55 for (int j = 0; j < b; j++) { 56 for (int k = 0; k < c; k++) { 57 scanf("%d", &mapp[i][j][k]);//輸入立方體資訊 58 } 59 } 60 } 61 int res = BFS(a, b, c); 62 if (res <= t) printf("%d\n", res); 63 else printf("-1\n"); 64 } 65 return 0; 66 }