[NWPU2016][寒假作业][正常版第三组]R&&HDU1240
题意是有个三维的地图,从起点到终点的最短路径。用bfs做,不过这个题坑的地方在于,开三维数组你要搞清楚纬度的关系。a[i][j][h] i是层,j是行,h是列。然后坐标呢,又是列,行,层,所以如果要用sx,sy,sz,读取的时候要用 sz,sy,sx,的顺序读取。然后才能啊a[sx][sy][sz]这么用。。。这个搞了好久才搞清楚。。。好笨啊。不这么来也行,只要搞清楚行列层关系就好。
#include <iostream> #include <algorithm> #include <cstdio> #include <map> #include <string> #include <string.h> #include <queue> #include <vector> #include <set> #include <cmath> #define inf 0x7fffffff using namespace std; char s[100],w[20][20][20],flag[20][20][20],m[20][20][20],e[100]; int n,sx,sy,sz,gx,gy,gz; int dir[6][3]={{1,0,0},{-1,0,0},{0,1,0},{0,-1,0},{0,0,1},{0,0,-1}}; struct p{ int x,y,z; }; int bfs(){ queue<p> q; p a; a.x=sx,a.y=sy,a.z=sz; flag[sx][sy][sz]=1; q.push(a); while(q.size()) { p b; b=q.front(); q.pop(); if(b.x==gx&&b.y==gy&&b.z==gz) return 1; for(int i=0;i<6;i++) { int nx=b.x+dir[i][0],ny=b.y+dir[i][1],nz=b.z+dir[i][2]; if(w[nx][ny][nz]=='O'&&!flag[nx][ny][nz]&&nx>0&&nx<=n&&ny>0&&ny<=n&&nz>0&&nz<=n) { flag[nx][ny][nz]=1; p c; c.x=nx,c.y=ny,c.z=nz; q.push(c); m[nx][ny][nz]=m[b.x][b.y][b.z]+1; } } } return 0; } int main() { while(scanf("%s%d",s,&n)!=EOF) { memset(flag,0,sizeof(flag)); memset(m,0,sizeof(m)); for(int i=1;i<=n;i++) { for(int j=1;j<=n;j++) { for(int h=1;h<=n;h++) { scanf(" %c",&w[i][j][h]); } } } scanf("%d%d%d%d%d%d",&sz,&sy,&sx,&gy,&gz,&gx); sx+=1,sy+=1,sz+=1,gx+=1,gy+=1,gz+=1; scanf("%s",e); if(bfs()) printf("%d %d\n",n,m[gx][gy][gz]); else printf("NO ROUTE\n"); } return 0; }