題意:三維空間,可以走上下左右前后六個方向,求最短路徑,BFS
??
#include<stdio.h> #include <queue> #include < string .h> using namespace std; const int MAXN= 50 ; char str[MAXN][MAXN][MAXN]; int step[MAXN][MAXN][MAXN]; int vis[MAXN][MAXN][MAXN]; int l,r,c; struct Node { int x,y,z; }s,e; int BFS() { int i,j; Node head,next; queue <Node> Q; Q.push(s); step[s.x][s.y][s.z] = 0 ; while (! Q.empty()) { head = Q.front(); Q.pop(); for (i= 0 ;i< 6 ;i++ ) { next = head; if (i== 0 ) next.x-= 1 ; if (i== 1 ) next.x+= 1 ; if (i== 2 ) next.y-= 1 ; if (i== 3 ) next.y+= 1 ; if (i== 4 ) next.z-= 1 ; if (i== 5 ) next.z+= 1 ; if (!vis[next.x][next.y][next.z] && str[next.x][next.y][next.z]== 1 ) { vis[next.x][next.y][next.z] = 1 ; Q.push(next); step[next.x][next.y][next.z] =step[head.x][head.y][head.z]+ 1 ; if (next.x==e.x && next.y==e.y && next.z==e.z) return step[head.x][head.y][head.z]+ 1 ; } } } return 0 ; } int main() { int i,j,k; while (scanf( " %d%d%d " ,&l,&r,&c)!= EOF) { if (l== 0 && r== 0 && c== 0 ) break ; memset(vis, 0 , sizeof (vis)); memset(str, 0 , sizeof (str)); for (i= 1 ; i<=l; i++ ) { for (j= 1 ; j<=r; j++ ) { scanf( " %s " ,str[i][j]+ 1 ); for (k= 1 ; str[i][j][k]; k++ ) { if (str[i][j][k]== ' # ' ) str[i][j][k]= 0 ; if (str[i][j][k]== ' . ' ) str[i][j][k]= 1 ; if (str[i][j][k]== ' S ' ) { str[i][j][k] = 1 ; s.x = i; s.y = j; s.z = k; } if (str[i][j][k]== ' E ' ) { str[i][j][k] = 1 ; e.x = i; e.y = j; e.z = k; } } } } int ans= BFS(); if (ans) printf( " Escaped in %d minute(s).\n " ,ans); else printf( " Trapped!\n " ); } return 0 ; }
?
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
