三维bfs
?????????????????????????????????? 勝利大逃亡
Time Limit: 4000/2000 MS (Java/Others)????Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 25112????Accepted Submission(s): 9609
魔 王住在一個城堡里,城堡是一個A*B*C的立方體,可以被表示成A個B*C的矩陣,剛開始Ignatius被關在(0,0,0)的位置,離開城堡的門在 (A-1,B-1,C-1)的位置,現在知道魔王將在T分鐘后回到城堡,Ignatius每分鐘能從一個坐標走到相鄰的六個坐標中的其中一個.現在給你城 堡的地圖,請你計算出Ignatius能否在魔王回來前離開城堡(只要走到出口就算離開城堡,如果走到出口的時候魔王剛好回來也算逃亡成功),如果可以請 輸出需要多少分鐘才能離開,如果不能則輸出-1.
?
Input 輸 入數據的第一行是一個正整數K,表明測試數據的數量.每組測試數據的第一行是四個正整數A,B,C和T(1<=A,B,C<=50,1& lt;=T<=1000),它們分別代表城堡的大小和魔王回來的時間.然后是A塊輸入數據(先是第0塊,然后是第1塊,第2塊......),每塊 輸入數據有B行,每行有C個正整數,代表迷宮的布局,其中0代表路,1代表墻.(如果對輸入描述不清楚,可以參考Sample Input中的迷宮描述,它表示的就是上圖中的迷宮)特別注意:本題的測試數據非常大,請使用scanf輸入,我不能保證使用cin能不超時.在本OJ上請使用Visual C++提交.
?
Output 對于每組測試數據,如果Ignatius能夠在魔王回來前離開城堡,那么請輸出他最少需要多少分鐘,否則輸出-1.?
Sample Input 1 3 3 4 20 0 1 1 1 0 0 1 1 0 1 1 1 1 1 1 1 1 0 0 1 0 1 1 1 0 0 0 0 0 1 1 0 0 1 1 0?
Sample Output 11 ?? 代碼:#include <stdio.h>
#include <string.h>int map[60][60][60];
int vt[60][60][60] ;struct N
{int x, y, z;int cnt;}s[210000], e, f;int xx[6]={0, 0, 0, 0, 1, -1};
int yy[6]={0, 0, -1, 1, 0, 0};
int zz[6]={1, -1, 0, 0, 0, 0};int a, b, c, tt;void bfs()
{int i, j=0, k=0 ;int flag = 0;e.x = 0;e.y = 0;e.z = 0;e.cnt = 0;s[k++] = e;vt[0][0][0] =1 ;while(j < k ){e = s[j++];if(e.x==a-1 && e.y==b-1 && e.z==c-1 ){if(e.cnt <= tt){printf("%d\n", e.cnt );return ;}else{printf("-1\n");return ;}}for(i=0; i<6; i++){f.x = e.x + xx[i];f.y = e.y + yy[i];f.z = e.z + zz[i];if( f.x>=0&&f.x<a &&f.y>=0&&f.y<b && f.z>=0 &&f.z<c&& vt[f.x][f.y][f.z]==0 && map[f.x][f.y][f.z]==1 ){f.cnt = e.cnt + 1;s[k++] = f;vt[f.x][f.y][f.z]=1;}}}printf("-1\n");/* if(flag==1 && sum <tt ){printf("%d\n", sum );}else{printf("-1\n");} */
}int main()
{int t;int i, j, k,ff;scanf("%d", &t) ;while(t--){memset(map, 0, sizeof(map ));memset(vt, 0, sizeof(vt ));k = 0;scanf("%d %d %d %d", &a, &b, &c, &tt );for(i=0; i<a; i++){for(j=0; j<b; j++){for(k=0; k<c; k++){scanf("%d", &ff );if(ff==1)map[i][j][k] = 0; //memset 為0,避免沖突修改一下,1代表路,0 代表墻else{map[i][j][k] = 1; }}}}if(map[a-1][b-1][c-1]==0 || a+b+c>tt) //出口處是墻 或者 可能到達出口的最短時間都比妖怪回來的時間長必然逃不了{printf("-1\n");continue;}bfs();}return 0;
}
?
轉載于:https://www.cnblogs.com/yspworld/p/3875802.html
總結