模板-BFS
//例:HDU1253
#include<bits/stdc++.h>
using namespace std;
int mm[51][51][51]; //地圖
bool vis[51][51][51]; //記錄數組
int dx[6]={1,-1,0,0,0,0};
int dy[6]={0,0,1,-1,0,0};
int dz[6]={0,0,0,0,1,-1};
int tx,ty,tz,ut;
bool fg;
typedef struct node{int x,y,z; //當前坐標int step; //到該點的最少步數
}node;
node bp; //開始點信息
void bfs(){queue<node> q;//構造隊列node pre,cur;//上一個點pre,和當前搜索點curq.push(bp);vis[1][1][1]=1;while(!q.empty()){pre=q.front();q.pop();if(pre.x==tx&&pre.y==ty&&pre.z==tz){ //終點跳出if(pre.step<=ut){fg=1;printf("%d\n",pre.step);return;}}for(int i=0;i<6;i++){cur.x=pre.x+dx[i];cur.y=pre.y+dy[i];cur.z=pre.z+dz[i];cur.step=pre.step+1;//根據搜索方向確定curif(cur.x<1||cur.y<1||cur.z<1)continue; //范圍剪枝if(cur.x>tx||cur.y>ty||cur.z>tz)continue; //范圍剪枝if(mm[cur.x][cur.y][cur.z]==1||vis[cur.x][cur.y][cur.z]==1)continue;vis[cur.x][cur.y][cur.z]=1;q.push(cur); //先走到的步數一定最少,個別有例外}}
}
int main()
{int num;scanf("%d",&num);while(num--){scanf("%d %d %d %d",&tx,&ty,&tz,&ut);memset(vis,0,sizeof(vis));for(int i=1;i<=tx;i++){for(int j=1;j<=ty;j++){for(int k=1;k<=tz;k++){scanf("%d",&mm[i][j][k]);}}}fg=0;bp.x=1;bp.y=1;bp.z=1;bp.step=0;bfs();if(!fg){printf("-1\n");}}return 0;
}
?
總結
- 上一篇: 世界三大顶级音响_世界十大名牌音响有那些
- 下一篇: Libvirt CPU Feature