魔戒(BFS+四维数组)
生活随笔
收集整理的這篇文章主要介紹了
魔戒(BFS+四维数组)
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
Description
藍色空間號和萬有引力號進入了四維水洼,發(fā)現(xiàn)了四維物體–魔戒。
這里我們把飛船和魔戒都抽象為四維空間中的一個點,分別標為 “S” 和 “E”。空間中可能存在障礙物,標為 “#”,其他為可以通過的位置。
現(xiàn)在他們想要盡快到達魔戒進行探索,你能幫他們算出最小時間是最少嗎?我們認為飛船每秒只能沿某個坐標軸方向移動一個單位,且不能越出四維空間。
Input
輸入數(shù)據(jù)有多組(數(shù)據(jù)組數(shù)不超過 30),到 EOF 結束。
每組輸入 4 個數(shù) x, y, z, w 代表四維空間的尺寸(1 <= x, y, z, w <= 30)。
接下來的空間地圖輸入按照 x, y, z, w 軸的順序依次給出,你只要按照下面的坐標關系循環(huán)讀入即可。
for 0, x-1
for 0, y-1
for 0, z-1
for 0, w-1
保證 “S” 和 “E” 唯一。
Output
對于每組數(shù)據(jù),輸出一行,到達魔戒所需的最短時間。
如果無法到達,輸出 “WTF”(不包括引號)。
Sample
Input
Output
1 3 #include<bits/stdc++.h>const int N = 55; using namespace std;int A,B,C,D; char mp[N][N][N][N]; bool vis[N][N][N][N]; int dirx[]= {0, 0, 0, 0, 0, 0, 1, -1}; int diry[]= {0, 0, 0, 0, 1, -1, 0, 0}; int dirz[]= {0, 0, 1, -1, 0, 0, 0, 0}; int dirw[]= {1, -1, 0, 0, 0, 0, 0, 0}; int flag; int aa, bb, cc, dd;struct node {int x;int y;int z;int w;int sum; }; int judge(int x, int y, int z, int w) {if (x >= 0 && x < A && y >= 0 && y < B && z >= 0 && z < C && w >= 0 && w < D && vis[x][y][z][w] == 0 && mp[x][y][z][w] != '#')return 1;return 0; } void bfs(int aa, int bb, int cc, int dd) {queue<node>Q;node a;a.x = aa;a.y = bb;a.z = cc;a.w = dd;a.sum = 0;vis[aa][bb][cc][dd] = 1;Q.push(a);flag = 1;while (!Q.empty()){a = Q.front();Q.pop();if (mp[a.x][a.y][a.z][a.w] == 'E'){printf ("%d\n", a.sum);flag = 0;break;}for (int i = 0; i < 8; i++){node b;b = a;b.x += dirx[i];b.y +=diry[i];b.z += dirz[i];b.w += dirw[i];if (judge(b.x, b.y, b.z, b.w)){b.sum++;vis[b.x][b.y][b.z][b.w] = 1;Q.push(b);}}}if (flag)printf ("WTF\n"); } int main () {while(cin >> A >> B >> C >> D){getchar();for (int i = 0; i < A; i++){for (int j = 0; j < B; j++){for (int k = 0; k < C; k++){for(int l = 0; l < D; l++){cin >> mp[i][j][k][l];if (mp[i][j][k][l] == 'S'){aa = i;bb = j;cc = k;dd = l;}}getchar();}}}memset(vis, 0, sizeof(vis));bfs(aa, bb, cc, dd);}return 0; }總結
以上是生活随笔為你收集整理的魔戒(BFS+四维数组)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: L - 病毒扩散(暴力)
- 下一篇: N - New Game(DFS+剪枝)