题意:给出一个六面体分为k层,每层n行m列,每个小立方体有'.'(空)与'#'(障碍)的状态,第一层某个空的位置有一个水龙头,水流每次往六个方向流动(...).最少时间水流能把立方体空的部分填满。
思路:从水龙头开始bfs一遍。每步让所有能转移到的空的点入队,总步数即为答案。
#include<cstdio> #include<queue> #include<iostream> using namespace std; struct Nod { int x; int y; int z; }; char node[11][11][11]; //第几层第几行第几列 int main() { int k,n,m; while(~scanf("%d%d%d",&k,&n,&m)) { int sum=0; getchar(); getchar(); for(int i=1;i<=k;i++) { for(int j=1;j<=n;j++) { for(int p=1;p<=m;p++) { scanf("%c",&node[i][j][p]); } getchar(); } getchar(); } queue<Nod> q; int sx,sy,nx,ny,nz; scanf("%d%d",&sx,&sy); Nod nod; nod.x=sx; nod.y=sy; nod.z=1; q.push(nod); sum++; node[1][sx][sy]='#'; while(!q.empty()) { nx=q.front().x; ny=q.front().y; nz=q.front().z; q.pop(); if(ny+1<=m && node[nz][nx][ny+1]=='.') { nod.x=nx;nod.y=ny+1;nod.z=nz; q.push(nod); sum++; node[nz][nx][ny+1]='#'; } if(ny-1>=1 && node[nz][nx][ny-1]=='.') { nod.x=nx;nod.y=ny-1;nod.z=nz; q.push(nod); sum++; node[nz][nx][ny-1]='#'; } if(nx+1<=n && node[nz][nx+1][ny]=='.') { nod.x=nx+1;nod.y=ny;nod.z=nz; q.push(nod); sum++; node[nz][nx+1][ny]='#'; } if(nx-1>=1 && node[nz][nx-1][ny]=='.') { nod.x=nx-1;nod.y=ny;nod.z=nz; q.push(nod); sum++; node[nz][nx-1][ny]='#'; } if(nz-1>=1 && node[nz-1][nx][ny]=='.') { nod.x=nx;nod.y=ny;nod.z=nz-1; q.push(nod); sum++; node[nz-1][nx][ny]='#'; } if(nz+1<=k && node[nz+1][nx][ny]=='.') { nod.x=nx;nod.y=ny;nod.z=nz+1; q.push(nod); sum++; node[nz+1][nx][ny]='#'; } } cout<<sum<<endl; } return 0; }
大腿说太年轻写的如此不优雅,debug很累
#include<cstdio> #include<queue> #include<iostream> using namespace std; struct Nod { int x; int y; int z; }; char node[11][11][11]; //第几层第几行第几列 int xx[11]={0,0,0,0,-1,1}; int yy[11]={0,0,-1,1,0,0}; int zz[11]={1,-1,0,0,0,0}; int main() { int k,n,m; while(~scanf("%d%d%d",&k,&n,&m)) { int sum=0; getchar(); getchar(); for(int i=1;i<=k;i++) { for(int j=1;j<=n;j++) { for(int p=1;p<=m;p++) { scanf("%c",&node[i][j][p]); } getchar(); } getchar(); } queue<Nod> q; int sx,sy,nx,ny,nz; scanf("%d%d",&sx,&sy); Nod nod; nod.x=sx; nod.y=sy; nod.z=1; q.push(nod); sum++; node[1][sx][sy]='#'; while(!q.empty()) { int nx=q.front().x; int ny=q.front().y; int nz=q.front().z; q.pop(); for(int i=0;i<6;i++) { int X=nx+xx[i]; int Y=ny+yy[i]; int Z=nz+zz[i]; if(X>=1 && X<=n && Y>=1 && Y<=m && Z>=1 && Z<=k) { if(node[Z][X][Y]=='.') { nod.x=X; nod.y=Y; nod.z=Z; q.push(nod); sum++; node[Z][X][Y]='#'; } } } } cout<<sum<<endl; } return 0; }