HDU 6113 度度熊的01世界 dfs
来源:互联网 发布:mp4转gif mac 编辑:程序博客网 时间:2024/06/05 09:16
度度熊的01世界
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 261 Accepted Submission(s): 51
Problem Description
度度熊是一个喜欢计算机的孩子,在计算机的世界中,所有事物实际上都只由0和1组成。
现在给你一个n*m的图像,你需要分辨他究竟是0,还是1,或者两者均不是。
图像0的定义:存在1字符且1字符只能是由一个连通块组成,存在且仅存在一个由0字符组成的连通块完全被1所包围。
图像1的定义:存在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
每组测试数据包含:
第一行两个整数n,m表示图像的长与宽。
接下来n行m列将会是只有01组成的字符画。
满足1<=n,m<=100
Output
如果这个图是1的话,输出1;如果是0的话,输出0,都不是输出-1。
Sample Input
32 32000000000000000000000000000000000000000000011111111000000000000000000000001111111111100000000000000000000011111111111100000000000000000001111111111111100000000000000000011111100011111000000000000000001111100000011110000000000000000011111000000111110000000000000000111110000000111110000000000000011111100000001111100000000000000111111000000001111100000000000001111110000000001111000000000000011111100000000011111000000000000111110000000000111100000000000001111000000000001111000000000000011110000000000011110000000000000111100000000000011100000000000000111100000000000111000000000000001111000000000001110000000000000011110000000000011100000000000001111000000000011110000000000000011110000000000111100000000000000011100000000001111000000000000000111110000011111110000000000000001111100011111111000000000000000011111111111111100000000000000000011111111111111000000000000000001111111111111000000000000000000001111111111100000000000000000000001111111000000000000000000000000011111000000000000000000000000000000000000000000000000032 3200000000000000000000000000000000000000000000000011111100000000000000000000000000111111100000000000000000000000011111111000000000000000000000001111111110000000000000000000000001111111100000000000000000000000011111111000000000000000000000001111111100000000000000000000000011111110000000000000000000000001111111100000000000000000000000011111111100000000000000000000000111111111000000000000000000000001111111100000000000000000000000111111100000000000000000000001111111111000000000000000000001111111111111000000000000000000111111111111110000000000000000001111111111111100000000000000000011111111111110000000000000000000000011111111110000000000000000000000000011111100000000000000000000000001111111000000000000000000000001111111100000000000000000000000001111111100000000000000000000000011111111000000000000000000000000111111111000000000000000000000001111111110000000000000000000000000111111110000000000000000000000000011111111110000000000000000000000111111111100000000000000000000000111111111000000000000000000000000000000000000003 3101101011
Sample Output
01-1
Source
2017"百度之星"程序设计大赛 - 初赛(A)
题意:判断1数字组成的图形是1,还是0,或者都不是。
答案是0的话,1的内部有一些连着的0(只能找到一堆)
答案是1的话,1的内部没有0。
答案是-1的话,1的内部有一些连着的0(能找到多堆),或者没有找到1,或者有多堆1.
思路:
题上说1内的0,不会到边界,所以先把边界上的所有0搜一遍,剩下的就是里面的1,和1里面的0了,统计剩下的1,和0 的堆数,就能确定答案了。
AC代码:
#include <cstdio>#include <cstring>#include <queue>#include <list>#include <algorithm>#define N 105using namespace std;int vis[N][N];//标记char ma[N][N];//地图int dx[5]= {0,0,1,-1};//四个方向int dy[5]= {1,-1,0,0};int n,m;void dfs(int x,int y,char s){ int xx,yy; for(int i=0; i<4; i++) { xx=x+dx[i]; yy=y+dy[i]; if(vis[xx][yy]) continue; if(xx<=0||xx>n||yy<=0||yy>m) continue; if(ma[xx][yy]==s) { vis[xx][yy]=1; dfs(xx,yy,s); } }}int main(){ while(~scanf("%d%d",&n,&m)) { memset(vis,0,sizeof(vis)); for(int i=1; i<=n; i++) scanf("%s",ma[i]+1); for(int i=1; i<=m; i++)//处理四个边界的0 { if(ma[1][i]=='0') { vis[1][i]=1; dfs(1,i,ma[1][i]); } if(ma[n][i]=='0') { vis[n][i]=1; dfs(n,i,ma[n][i]); } } for(int i=1; i<=n; i++) { if(ma[i][1]=='0') { vis[i][1]=1; dfs(i,1,ma[i][1]); } if(ma[i][m]=='0') { vis[i][m]=1; dfs(i,m,ma[i][m]); } } int a1=0,a0=0; for(int i=1; i<=n; i++)//统计剩下的1和0的堆数 for(int j=1; j<=m; j++) { if(!vis[i][j]) { vis[i][j]=1; if(ma[i][j]=='0') a0++; else a1++; dfs(i,j,ma[i][j]); } } if(a1==1&&a0==0) printf("1\n"); else if(a1==1&&a0==1) printf("0\n"); else printf("-1\n"); }}
阅读全文
0 0
- 【HDU 6113 度度熊的01世界 】 & DFS
- HDU 6113 度度熊的01世界 dfs
- 【dfs】hdu 6113 度度熊的01世界
- HDU 6113 度度熊的01世界 (DFS
- HDU 6113 度度熊的01世界(dfs)
- HDU 6113 度度熊的01世界 (暴力dfs)
- hdu 6113 度度熊的01世界(dfs)
- hdu 6113 度度熊的01世界 (dfs+扩边界)
- HDU 6113 度度熊的01世界(dfs)
- HDU 6113 度度熊的01世界(简单dfs)
- HDU 6113 度度熊的01世界 【DFS】(2017"百度之星"程序设计大赛
- 度度熊的01世界 dfs
- BestCoder 度度熊的01世界 (DFS)
- HDU6113 度度熊的01世界(dfs)
- hdu 6113 度度熊的01世界
- HDU-6113 度度熊的01世界
- HDU 6113 度度熊的01世界【搜索】
- hdu 6113 度度熊的01世界
- 1015. Reversible Primes (20)
- 【南阳OJ116】士兵杀敌(二)(线段树)
- 网络协议篇之SNMP协议(一)——SNMP报文协议
- JavaWeb前端该如何学习,推荐一些学习资源和方法(不断更新)
- 2017.8.12
- HDU 6113 度度熊的01世界 dfs
- 堆的实现及堆排序
- 2017/8/12
- 阿里路由框架--ARouter 源码解析之Compiler
- 【Linux】-- ufw 端口操作
- osg 添加纹理
- 内存对齐小解
- Mysql存储过程和函数(六)
- 背包九讲第一讲-简单的0/1背包问题有感1.1