2017百度之星初赛:A-1006. 度度熊的01世界(DFS)

来源:互联网 发布:网络教育第二学位 编辑:程序博客网 时间:2024/06/05 19:05

度度熊的01世界

 
 Accepts: 967
 
 Submissions: 3064
 Time Limit: 2000/1000 MS (Java/Others)
 
 Memory Limit: 32768/32768 K (Java/Others)
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。

Sample Input
32 320000000000000000000000000000000000000000000111111110000000000000000000000011111111111000000000000000000000111111111111000000000000000000011111111111111000000000000000000111111000111110000000000000000011111000000111100000000000000000111110000001111100000000000000001111100000001111100000000000000111111000000011111000000000000001111110000000011111000000000000011111100000000011110000000000000111111000000000111110000000000001111100000000001111000000000000011110000000000011110000000000000111100000000000111100000000000001111000000000000111000000000000001111000000000001110000000000000011110000000000011100000000000000111100000000000111000000000000011110000000000111100000000000000111100000000001111000000000000000111000000000011110000000000000001111100000111111100000000000000011111000111111110000000000000000111111111111111000000000000000000111111111111110000000000000000011111111111110000000000000000000011111111111000000000000000000000011111110000000000000000000000000111110000000000000000000000000000000000000000000000000
Sample Output
0


严格按照题目的要求来做这题就过了↓


DFS记录0和1的连通块个数和没有被包围的连通块个数

之后判断一下就好了

#include<stdio.h>#include<string.h>int n, m, ok, flag[105][105], a[105][105], dir[4][2] = {1,0,0,1,-1,0,0,-1};void Sech(int x, int y){int dx, dy, i;flag[x][y] = 1;for(i=0;i<=3;i++){dx = x+dir[i][0];dy = y+dir[i][1];if(dx<1 || dx>n || dy<1 || dy>m){ok = 0;continue;}if(flag[dx][dy]==1 || a[dx][dy]!=a[x][y])continue;Sech(dx, dy);}}int main(void){int i, j, z0, z1, x0, x1;while(scanf("%d%d", &n, &m)!=EOF){memset(flag, 0, sizeof(flag));for(i=1;i<=n;i++){for(j=1;j<=m;j++)scanf("%1d", &a[i][j]);}z0 = z1 = x0 = x1 = 0;for(i=1;i<=n;i++){for(j=1;j<=m;j++){if(flag[i][j]==0){ok = 1;Sech(i, j);if(a[i][j]==0)z0++, x0 += ok;elsez1++, x1 += ok;}}}if(z1==1 && x0==0)printf("1\n");else if(z1==1 && x0==1)printf("0\n");elseprintf("-1\n");}return 0;}

阅读全文
1 0