zoukankan      html  css  js  c++  java
  • 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;
    }
    小小优雅后
  • 相关阅读:
    微信小程序购物商城系统开发系列-工具篇
    CSS实现导航条Tab切换的三种方法
    最详细win7下手动搭建PHP环境:apache2.4.23+php7.0.11
    读书笔记:《HTML5开发手册》Web表单
    jQuery可拖拽3D万花筒旋转特效
    框架基础:关于ajax设计方案(三)---集成ajax上传技术
    框架基础:ajax设计方案(二)---集成轮询技术
    框架基础:ajax设计方案(一)---集成核心请求
    Apache+PHP+MySQL
    自学 PHP,如何不走弯路?
  • 原文地址:https://www.cnblogs.com/LinesYao/p/5451429.html
Copyright © 2011-2022 走看看