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
度度熊是一个喜欢计算机的孩子,在计算机的世界中,所有事物实际上都只由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
- hdu 6113 度度熊的01世界/2017 百度之星
- HDU 6113 度度熊的01世界 【DFS】(2017"百度之星"程序设计大赛
- HDU 6113 度度熊的01世界【2017"百度之星"】【简单搜索判断联通块】
- 百度之星初赛(A)Hdu-6113.度度熊的01世界
- 百度之星1006度度熊的01世界
- 【原创】【百度之星2017初赛A】1006 度度熊的01世界
- 2017百度之星初赛:A-1006. 度度熊的01世界(DFS)
- HDU6113 度度熊的01世界(深搜DFS,2017"百度之星"程序设计大赛
- Hdu6113度度熊的01世界(2017"百度之星"程序设计大赛
- 2017百度之星初赛(A) 度度熊的01世界(BFS/DFS)
- hdu6113 2017"百度之星"初赛(A)1006度度熊的01世界(搜索)
- 2017百度之星初赛(A) 1006 度度熊的01世界(搜索连通块)
- HDU6113 度度熊的01世界(深搜DFS,2017"百度之星"程序设计大赛
- 2017 百度之星A轮初赛(小C的倍数问题, 今夕何夕, 度度熊的01世界)
- 2017百度之星初赛(A) 1006 度度熊的01世界(bfs找连通块)
- 百度之星初赛(A)--度度熊的01世界----bfs搜索
- 【HDU 6113 度度熊的01世界 】 & DFS
- HDU 6113 度度熊的01世界 dfs
- 一道动态规划的poj
- int main(int argc, char* argv[])
- 百度之星 2017初赛第一场 1001 小C的倍数问题
- 2017年8月12日训练日记
- UVA11090-Going in Cycle!!-最短路/图判环/二分
- hdu 6113 度度熊的01世界/2017 百度之星
- python数据结构之字典
- iWebSMS2000短信发送问题记录
- 为什么工厂模式是华而不实的—浅谈工厂模式的利与弊
- web.xml 中元素加载顺序及其详解
- Java Web开发环境搭建
- Java中switch理解
- N的阶乘 mod M(同余)
- myeclipse生成HTML格式的API帮助文档实例