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;
}
上一篇: PHP获取指定日期是星期几的实现方法