hdu 6113 度度熊的01世界/2017 百度之星

来源:互联网 发布:淘宝号心怎么升级最快 编辑:程序博客网 时间:2024/05/16 09:23
Problem Description
度度熊是一个喜欢计算机的孩子,在计算机的世界中,所有事物实际上都只由0和1组成。

现在给你一个n*m的图像,你需要分辨他究竟是0,还是1,或者两者均不是。

图像0的定义:存在1字符且1字符只能是由一个连通块组成,存在且仅存在一个由0字符组成的连通块完全被1所包围。

图像1的定义:存在1字符且1字符只能是由一个连通块组成,不存在任何0字符组成的连通块被1所完全包围。

连通的含义是,只要连续两个方块有公共边,就看做是连通。

完全包围的意思是,该连通块不与边界相接触。

Input
本题包含若干组测试数据。 每组测试数据包含: 第一行两个整数n,m表示图像的长与宽。 接下来n行m列将会是只有01组成的字符画。

满足1<=n,m<=100

Output

如果这个图是1的话,输出1;如果是0的话,输出0,都不是输出-1。


分析:因为只有0,1而且1只能是一个联通快所以,对与0来说 如果只与1相邻 则说明0被1包围,如果0还达到了边界 则不被1包围。同理1也是。

#include <iostream>#include<stdio.h>#include<string.h>#include<algorithm>#include<vector>#define siz 105using namespace std;const int maxn = 100;typedef long long LL;int n,m;char S[maxn+5][maxn+5];int cnt,vis[maxn+5][maxn+5];// cnt 联通快的个数int yes[maxn*maxn+5],is[maxn*maxn+5],hv[maxn*maxn+5][5];// yes 是否与达到边界, is表示联通快是1还是0, hv与那些相邻。int f[4][2] = {{1,0},{0,1},{-1,0},{0,-1}};void dfs(int x,int y){    vis[x][y] = 1;    for(int i=0; i<4; i++)    {        int nx = x+f[i][0] ,ny=y+f[i][1];        if(nx<1||ny<1||nx>n||ny>m) continue;        if(S[nx][ny]!=S[x][y])        {            hv[cnt][S[nx][ny]-'0'] = 1;// 第cnt个联通快与 S[nx][ny]相邻。            continue;        }        if(vis[nx][ny]) continue;        if(nx==1||nx==n||ny==1||ny==m) yes[cnt] = 1;//第cnt个联通快是否到底边界。        dfs(nx,ny);    }}int ok(){    int cot = 0,tot=0;    cnt = 0;    for(int i=1; i<=n; i++)    {        for(int j=1; j<=m; j++) if(!vis[i][j])            {                cnt++;                if(S[i][j]=='1') cot++;                is[cnt] = S[i][j]-'0';                if(i==1||i==n||j==1||j==m) yes[cnt] = 1;//注意 传进去的x,y点要 判断。                dfs(i,j);            }    }    if(cot!=1) return -1;//1联通快不是一个就为-1    for(int i=1; i<=cnt; i++)    {        if(is[i]==0)        {            if(!yes[i]&&hv[i][1]) tot++;        }    }    if(tot==1) return 0;// 被1包围的0的联通快为一个就为 0    if(tot==0) return 1;// 不存在任何0字符组成的连通块被1所完全包围    return -1;}int main(){    while(~scanf("%d %d",&n,&m))    {        for(int i=1; i<=n; i++)        {            scanf("%s",S[i]+1);        }        for(int i=1; i<=n*m; i++) yes[i] = 0;        memset(hv,0,sizeof(hv));        memset(vis,0,sizeof(vis));        int ty = ok();        printf("%d\n",ty);    }    return 0;}


阅读全文
0 0