欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

PIPIOJ 1033: 拆字游戏 dfs连通分量

程序员文章站 2022-04-01 17:29:12
...

题目:

http://39.106.164.46/problem.php?id=1033

代码如下:

#include<iostream>
#include<algorithm>
#include<stdio.h>
#include<cmath>
#include<queue>
#include<cstring>
#include<vector>
#include<stack>
#include<map>
#include<set>
#define MAX 505
#define INF 0x3f3f3f3f
typedef long long ll;
using namespace std;

int n,m;
int mp[MAX][MAX],vis[MAX][MAX],dir[4][2]={{0,1},{0,-1},{-1,0},{1,0}};
int maxx,maxy,minx,miny;
char ch[MAX][MAX];

bool judge(int x,int y){
    if(x<1||x>n||y<1||y>m) return false;
    return true;
}

void dfs(int x,int y){
    vis[x][y]=1;
    maxx=max(maxx,x);
    maxy=max(maxy,y);
    minx=min(minx,x);
    miny=min(miny,y);
    for(int i=0;i<4;i++){
        int xx=x+dir[i][0],yy=y+dir[i][1];
        if(judge(xx,yy)&&mp[xx][yy]==1&&vis[xx][yy]==0){
            dfs(xx,yy);
        }
    }
}


int main(){
    while(scanf("%d %d",&n,&m)!=EOF){
        memset(mp,0,sizeof(mp));
        for(int i=1;i<=n;i++){
            scanf("%s",ch[i]+1);
        }
        for(int i=1;i<=n;i++){
            for(int j=1;j<=m;j++){
                mp[i][j]=ch[i][j]-'0';
            }
        }
        for(int j=1;j<=m;j++){
            for(int i=1;i<=n;i++){
                if(mp[i][j]==1&&vis[i][j]==0){
                    maxx=maxy=0;
                    minx=miny=INF;
                    dfs(i,j);
                    printf("%d %d\n",maxx-minx+1,maxy-miny+1);
                    for(int k=minx;k<=maxx;k++){
                        for(int h=miny;h<=maxy;h++){
                            printf("%d",mp[k][h]&&vis[k][h]);
                        }
                        printf("\n");
                    }
                }
            }
        }
    }
    return 0;
}
相关标签: PIPIOJ