hdu 6113 度度熊的01世界/2017 百度之星
2017-08-12 17:31
381 查看
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也是。
度度熊是一个喜欢计算机的孩子,在计算机的世界中,所有事物实际上都只由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 105 using 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与那些相邻。 in bb36 t 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; }
相关文章推荐
- HDU 6113 度度熊的01世界【2017"百度之星"】【简单搜索判断联通块】
- HDU 6113 度度熊的01世界 【DFS】(2017"百度之星"程序设计大赛 - 初赛(A))
- HDU - 6113 度度熊的01世界 (2017"百度之星"程序设计大赛 - 初赛(A)1006)
- 2017"百度之星"程序设计大赛 - 初赛(A) [ hdu 6108 小C的倍数问题 ] [ hdu 6109 数据分割 ] [ hdu 6110 路径交 ] [ hdu 6112 今夕何夕 ] [ hdu 6113 度度熊的01世界 ]
- HDU 6113 度度熊的01世界 【DFS】(2017"百度之星"程序设计大赛 - 初赛(A))
- hdu 6113 度度熊的01世界
- HDU 6113 度度熊的01世界(简单dfs)
- 2017"百度之星"程序设计大赛 - 初赛(A) :6113、度度熊的01世界
- hdu 6113 度度熊的01世界
- HDU 6113 度度熊的01世界 (DFS
- hdu 6113 度度熊的01世界【搜索好题】
- HDU 6113 度度熊的01世界(dfs)
- 【判连通】HDU 6113 度度熊的01世界
- HDU 6113 度度熊的01世界(dfs)
- 【HDU 6113 度度熊的01世界 】 & DFS
- HDU-6113 度度熊的01世界
- HDU -- 6113 度度熊的01世界 【搜联通块 + 思维】
- HDU 6113 度度熊的01世界
- 2017百度之星初赛:A-1006. 度度熊的01世界(DFS)
- 百度之星2017初赛A-1006-度度熊的01世界