1. 程式人生 > >魔戒(思維+bfs)

魔戒(思維+bfs)

spl bfs搜索 lag using algo main push output 依次

Description

藍色空間號和萬有引力號進入了四維水窪,發現了四維物體--魔戒。

這裏我們把飛船和魔戒都抽象為四維空間中的一個點,分別標為 "S" 和 "E"。空間中可能存在障礙物,標為 "#",其他為可以通過的位置。

現在他們想要盡快到達魔戒進行探索,你能幫他們算出最小時間是最少嗎?我們認為飛船每秒只能沿某個坐標軸方向移動一個單位,且不能越出四維空間。

Input

輸入數據有多組(數據組數不超過 30),到 EOF 結束。

每組輸入 4 個數 x, y, z, w 代表四維空間的尺寸(1 <= x, y, z, w <= 30)。

接下來的空間地圖輸入按照 x, y, z, w 軸的順序依次給出,你只要按照下面的坐標關系循環讀入即可。

for 0, x-1

for 0, y-1

for 0, z-1

for 0, w-1

保證 "S" 和 "E" 唯一。

Output

對於每組數據,輸出一行,到達魔戒所需的最短時間。

如果無法到達,輸出 "WTF"(不包括引號)。

Sample Input

2 2 2 2
..
.S
..
#.
#.
.E
.#
..
2 2 2 2
..
.S
#.
##
E.
.#
#.
..

Sample Output

1
3
題解:其實四維空間博主也不太懂,這道題其實
技術分享圖片
 1 #include<cstdio>
 2 #include<cstring>
 3 #include<stack>
 4 #include<queue>
 5 #include<algorithm>
 6 #include<map>
 7 #include<vector>
 8 #define PI acos(-1.0)
 9 using namespace std;
10 #define
Inf 0x3f3f3f3f 11 typedef long long ll; 12 int m,n,x,y,flag=0; 13 char str[45][45][45][45]; 14 int visit[50][50][50][50]; 15 int dis[500][500]; 16 int di[8][4]= {{0,0,0,1},{0,0,0,-1},{0,0,1,0},{0,0,-1,0},{0,1,0,0},{0,-1,0,0},{1,0,0,0},{-1,0,0,0}}; 17 map<ll,ll>::iterator it; 18 struct node 19 { 20 int x,y,z,w,step; 21 } ; 22 int bfs(int sx,int sy,int sz,int sw) 23 { 24 queue<node>pp; 25 node s,q; 26 s.x=sx; 27 s.y=sy; 28 s.z=sz; 29 s.w=sw; 30 s.step=0; 31 pp.push(s); 32 memset(visit,0,sizeof(visit)); 33 visit[s.x][s.y][s.z][s.w]=1; 34 while(!pp.empty()) 35 { 36 s=pp.front(); 37 if(str[s.x][s.y][s.z][s.w]==E) 38 { 39 flag=0; 40 return s.step; 41 } 42 pp.pop(); 43 for(int i=0; i<8; i++) 44 { 45 q.x=s.x+di[i][0]; 46 q.y=s.y+di[i][1]; 47 q.z=s.z+di[i][2]; 48 q.w=s.w+di[i][3]; 49 q.step=s.step; 50 if(q.x>=0&&q.x<m&&q.y>=0&&q.y<n&&q.z>=0&&q.z<x&&q.w>=0&&q.w<y&&!visit[q.x][q.y][q.z][q.w]&&str[q.x][q.y][q.z][q.w]!=#) 51 { 52 q.step++; 53 visit[q.x][q.y][q.z][q.w]=1; 54 pp.push(q); 55 } 56 } 57 } 58 } 59 int main() 60 { 61 int z,w,sx,sy,sz,sw,i,j,ans; 62 while(scanf("%d%d%d%d",&m,&n,&x,&y)!=-1) 63 { 64 flag=1; 65 for(i=0; i<m; i++) 66 for(j=0; j<n; j++) 67 for(z=0; z<x; z++) 68 for(w=0; w<y; w++) 69 { 70 scanf(" %c",&str[i][j][z][w]); 71 if(str[i][j][z][w]==S) 72 { 73 sx=i,sy=j,sz=z,sw=w; 74 } 75 76 } 77 ans=bfs(sx,sy,sz,sw); 78 if(flag) 79 puts("WTF"); 80 else 81 printf("%d\n",ans); 82 } 83 return 0; 84 }
View Code

題意很簡單從s->E的最短路,4維數組+bfs搜索一下就哦了,bfs裸題

魔戒(思維+bfs)