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;
    }
    小小优雅后
  • 相关阅读:
    Android_listview设置每条信息的间距
    Android实现ListView或GridView首行/尾行距离屏幕边缘距离
    实现类似微信的延迟加载的Fragment——LazyFragment
    struts2的Action该方法不能去
    (工具)source insight高速增加时间代码
    猫学习IOS(十五)UI以前的热的打砖块游戏
    java语言内部类和匿名内部类
    JVM截至多少线程可以创建: unable to create new native thread
    linux下一个Oracle11g RAC建立(八)
    转基因小麦--主题在农业科技的最前沿
  • 原文地址:https://www.cnblogs.com/LinesYao/p/5451429.html
Copyright © 2011-2022 走看看