2815:城堡问题 百炼 求连通子图个数

来源:互联网 发布:网络电视转换数字电视 编辑:程序博客网 时间:2024/05/01 04:18

#include<stdio.h>
#include<string.h>
int map[60][60];
int vis[60][60];
int col[4]={0,-1,0,1};
int row[4]={-1,0,1,0};//西,北,东,南
int val[4]={1,2,4,8};
int m,n;
int dfs(int p){
    int a=p/n,b=p%n;
    //printf("%d```%d\n",a,b);
    vis[a][b]=1;
    int ans=1;
    for(int i=0;i<4;i++){
        int x=a+col[i],y=b+row[i];
        if(x>=0&&y>=0&&x<m&&y<n){
        if(!vis[x][y]&&!(map[a][b]&val[i])){
            ans+=dfs(x*n+y);
        }
        }
    }
    return ans;
}
int main(){
    scanf("%d%d",&m,&n);
    for(int i=0;i<m;i++)
    for(int j=0;j<n;j++)
    scanf("%d",&map[i][j]);
    memset(vis,0,sizeof(vis));
    int cnt=0,max=0,ans=0;
    for(int i=0;i<m;i++)
    for(int j=0;j<n;j++){
        if(!vis[i][j]){
            cnt++;
            ans=dfs(i*n+j);
            if(ans>max) max=ans;
        }
    }
    printf("%d\n%d\n",cnt,max);
    return 0;
}