• [POJ]1164 The Castle


    //markdown复制进来一堆问题 还是链接方便点
    POJ 1164 The Castle

    首先想到用9个方格来表示一个房间,如此一来复杂许多,MLE代码如下:

    //Writer:GhostCai && His Yellow Duck
    
    #include<iostream>
    #define MAXN 50
    using namespace std;
    
    int m,n;
    int a[MAXN][MAXN];
    bool vis[MAXN][MAXN];
    
    void opet(int num,int x,int y){
        bool up=0,dn=0,lf=0,rt=0;//!!!
        if(num>=8){
            dn=1;
            num-=8;
        }
        if(num>=4){
            rt=1;
            num-=4;
        }
        if(num>=2){
            up=1;
            num-=2;
        }
        if(num>=1){
            lf=1;
        }
        a[x*2][y*2]=2;
        if(up) a[x*2-1][y*2]=1,a[x*2-1][y*2+1]=1,a[x*2-1][y*2-1]=1; 
        if(dn) a[x*2+1][y*2]=1,a[x*2+1][y*2+1]=1,a[x*2+1][y*2-1]=1; 
        if(lf) a[x*2][y*2-1]=1,a[x*2+1][y*2-1]=1,a[x*2-1][y*2-1]=1; 
        if(rt) a[x*2][y*2+1]=1,a[x*2+1][y*2+1]=1,a[x*2-1][y*2+1]=1; 
    
    }
    
    void dfs(int x,int y){
        if(vis[x][y]) return;
        if(x<1||x>m*2+1||y<1||y>n*2+1) return;
        if(a[x][y]==1) return;
        if(a[x][y]!=0) vis[x][y]=1;//!!
        if(a[x][y]==2) a[x][y]=-1;
        dfs(x+1,y);
        dfs(x-1,y);
        dfs(x,y+1);
        dfs(x,y-1);
    } 
    
    int calc(){
        int cnt=0;
        for(register int i=1;i<=m*2+1;i++){
            for(register int j=1;j<=n*2+1;j++){
                if(a[i][j]==-1){
                    cnt++;
                    a[i][j]=2;
                }
            }
        }
    
        return cnt;
    }
    
    int main(){
        cin>>m>>n;
        int i,j;
        int r;
        for(i=1;i<=m;i++){
            for(j=1;j<=n;j++){
                cin>>r;
                opet(r,i,j);
            }
        }
        int ans=0,mx=0,cnt=0;
        for(i=1;i<=m*2+1;i++) a[i][1]=1,a[i][n*2+1]=1;
        for(i=1;i<=n*2+1;i++) a[1][i]=1,a[m*2+1][i]=1;
    
    //  for(i=1;i<=m*2+1;i++){
    //      for(j=1;j<=n*2+1;j++){
    //          cout<<a[i][j]<<" ";
    //      }
    //      cout<<endl;
    //  }
    
        for(i=1;i<=m*2+1;i++){
            for(j=1;j<=n*2+1;j++){
                if(!vis[i][j]&&a[i][j]==2){
                    dfs(i,j);
                    cnt++;
                    ans=calc();
                    mx=max(ans,mx);
                }
            }
        }
        cout<<cnt<<endl<<mx<<endl;
        return 0;
    }
    

    百般无奈下,重新思路。
    想到其实没必要用9个方格,一个就挺好。
    只不过在搜索的时候,利用数字判断一下这个方向走不走。

    注意的一点是局部变量要赋初值,dfs里四个布尔位置变量一开始没有赋初值,导致奇怪的结果。
    还是很像swim,嗯。

    //Writer:GhostCai && His Yellow Duck
    
    #include<iostream>
    #define MAXN 200 
    using namespace std;
    
    int m,n;
    int a[MAXN][MAXN];
    bool vis[MAXN][MAXN];
    
    void dfs(int x,int y){
        if(vis[x][y]) return;
        if(x<1||x>m||y<1||y>n) return;
        int d=a[x][y];
        vis[x][y]=1;//!!
        a[x][y]+=666;
        bool lf=0,rt=0,up=0,dn=0;//!!!
        if(d>=8){
            d-=8;
            dn=1;
         }
         if(d>=4){
            d-=4;
            rt=1;
         }
         if(d>=2){
            up=1;
            d-=2;
         }
         if(d>=1){
            lf=1;
         }
         if(!lf) dfs(x,y-1);
         if(!rt) dfs(x,y+1);
         if(!dn) dfs(x+1,y);
         if(!up) dfs(x-1,y);
    
    } 
    
    int calc(){
        int cnt=0;
        for(register int i=1;i<=m;i++){
            for(register int j=1;j<=n;j++){
                if(a[i][j]>16){
                    cnt++;
                    a[i][j]-=666;
                }
            }
        }
    
        return cnt;
    }
    
    int main(){
        int ans=0,mx=0,cnt=0;
        cin>>m>>n;
        int i,j;
        for(i=1;i<=m;i++){
            for(j=1;j<=n;j++){
                cin>>a[i][j];
            }
        }
        for(i=1;i<=m;i++){
            for(j=1;j<=n;j++){
                if(!vis[i][j]){
                    dfs(i,j);
                    cnt++;
                    ans=calc();
                    mx=max(mx,ans);
                }
            }
        }
        cout<<cnt<<endl<<mx<<endl;
    }
    

    本文来自博客园,作者:GhostCai,转载请注明原文链接:https://www.cnblogs.com/ghostcai/p/9247545.html

  • 相关阅读:
    浅析Java源码之LinkedList
    浅析Java源码之ArrayList
    Vue源码终笔-VNode更新与diff算法初探
    Vue源码后记-更多options参数(2)
    Vue源码后记-更多options参数(1)
    Vue源码后记-其余内置指令(3)
    Vue源码后记-其余内置指令(2)
    Vue源码后记-其余内置指令(1)
    Vue源码后记-vFor列表渲染(3)
    Linux/CentOS 7 timezone 修改
  • 原文地址:https://www.cnblogs.com/ghostcai/p/9247545.html
Copyright © 2020-2023  润新知