您的位置:首页 > 其它

HDU 6113 度度熊的01世界 (暴力dfs)

2017-08-13 09:37 441 查看

思路:

因为条件是存在一个1的联通块包含着一个0的联通快的才是 0 所以,我们先预处理边界,对于0的边界处理成以访问过,对于边界是1的不做操作。

然后暴力判断每个点是否访问过来进行dfs求联通块的个数,如果0的个数和1的个数都是1,那么可以肯定图像为0,如果0的个数是0,1的个数是1,那么图像为1

#include<stdio.h>
#include <iostream>
#include<string.h>
#include<math.h>
#include<algorithm>
#define eps 1e-8
typedef long long int lli;
using namespace std;

int ma[550][550];
bool v[550][550];
char s[550];
int dir[4][2] = {0,-1, 0,1, -1,0, 1,0};

void dfs(int x,int ii,int jj){
v[ii][jj] = 1;
for(int i = 0;i <= 3;i++){
int iii = ii+dir[i][0], jjj = jj + dir[i][1];
if(ma[iii][jjj] == x && !v[iii][jjj]){
dfs(x,iii,jjj);
}
}
}

int main(){
int n,m;
while(~scanf("%d%d",&n,&m)){
memset(ma,0,sizeof(ma));
memset(v,0,sizeof(v));
for(int i = 1;i <= n;i++){
scanf("%s",s);
for(int j = 0;s[j];j++){
if(s[j]=='1') ma[i][j+1] = 1;
if(s[j]=='0') ma[i][j+1] = -1;
}
}
for(int j = 1;j <= m;j++){
if(!v[1][j] && ma[1][j]==-1) dfs(-1,1,j);
if(!v
[j] && ma
[j]==-1) dfs(-1,n,j);
}
for(int i = 1;i <= n;i++){
if(!v[i][1] && ma[i][1]==-1) dfs(-1,i,1);
if(!v[i][m] && ma[i][m]==-1) dfs(-1,i,m);
}
int cnt0=0,cnt1=0;
for(int i = 1;i <= n;i++){
for(int j = 1;j <= m;j++){
if(!v[i][j]){
if(ma[i][j]==1){
cnt1++;
}
if(ma[i][j]==-1){
cnt0++;
}
dfs(ma[i][j],i,j);
}
}
}
if(cnt0==cnt1 && cnt1==1){
puts("0");
}
else if(cnt0==0 && cnt1 == 1){
puts("1");
}
else
puts("-1");
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: