codeforces 60B bfs

题意:给出一个六面体分为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;
}
View Code

大腿说太年轻写的如此不优雅,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;
}
小小优雅后
原文地址:https://www.cnblogs.com/LinesYao/p/5451429.html