[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

原文地址:https://www.cnblogs.com/ghostcai/p/9247545.html