度度熊是一个喜欢计算机的孩子,在计算机的世界中,所有事物实际上都只由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 32
00000000000000000000000000000000
00000000000111111110000000000000
00000000001111111111100000000000
00000000001111111111110000000000
00000000011111111111111000000000
00000000011111100011111000000000
00000000111110000001111000000000
00000000111110000001111100000000
00000000111110000000111110000000
00000001111110000000111110000000
00000001111110000000011111000000
00000001111110000000001111000000
00000001111110000000001111100000
00000001111100000000001111000000
00000001111000000000001111000000
00000001111000000000001111000000
00000001111000000000000111000000
00000000111100000000000111000000
00000000111100000000000111000000
00000000111100000000000111000000
00000001111000000000011110000000
00000001111000000000011110000000
00000000111000000000011110000000
00000000111110000011111110000000
00000000111110001111111100000000
00000000111111111111111000000000
00000000011111111111111000000000
00000000111111111111100000000000
00000000011111111111000000000000
00000000001111111000000000000000
00000000001111100000000000000000
00000000000000000000000000000000
32 32
00000000000000000000000000000000
00000000000000001111110000000000
00000000000000001111111000000000
00000000000000011111111000000000
00000000000000111111111000000000
00000000000000011111111000000000
00000000000000011111111000000000
00000000000000111111110000000000
00000000000000111111100000000000
00000000000001111111100000000000
00000000000001111111110000000000
00000000000001111111110000000000
00000000000001111111100000000000
00000000000011111110000000000000
00000000011111111110000000000000
00000001111111111111000000000000
00000011111111111111000000000000
00000011111111111111000000000000
00000011111111111110000000000000
00000000001111111111000000000000
00000000000000111111000000000000
00000000000001111111000000000000
00000000000111111110000000000000
00000000000011111111000000000000
00000000000011111111000000000000
00000000000011111111100000000000
00000000000011111111100000000000
00000000000000111111110000000000
00000000000000001111111111000000
00000000000000001111111111000000
00000000000000000111111111000000
00000000000000000000000000000000
3 3
101
101
011
Sample Output
0
1
-1

大体意思就是判断输入的这个巨型地图是0还是1,乍一看很懵,实际上就是搜索可以解决的问题。从0和1的定义出发,0是存在1字符且1字符只能是由一个连通块组成,存在且仅存在一个由0字符组成的连通块完全被1所包围,也就是说只存在一个1的连通分支且只有一个0的连通分支被1的连通分支包围,而对于1连通分支外面的并没有要求,所以0的条件就是只有一个1包围一个内圈0,并不需要想太多,而1的要求是说存在1字符且1字符只能是由一个连通块组成,不存在任何0字符组成的连通块被1所完全包围,即没有任何内圈0只有一个1连通分支,其余情况就全是-1了。理解好定义就可以对常见的求连通分支数的DFS进行拓展,主要是处理好内圈0和外圈0的判断,这里参考了网上的做法,不需要BFS,在搜索时,如果下一个位置是越界的,且当前位置是0,那么这就是外圈0,对应的,如果所有情况都没有越界,这种情况就是内圈0。

AC代码

#include<iostream>
#include<stdio.h>
#include<string.h>
using namespace std;
int Map[105][105];
int vis[105][105];
int dir[4][2]={1,0,-1,0,0,1,0,-1};
int N,M;
int flag=1;
void dfs(int x,int y)
{for(int i=0;i<4;i++){int tx=x+dir[i][0];int ty=y+dir[i][1];if(tx<0||ty<0||tx>=N||ty>=M){if(Map[x][y]==0) flag=0;continue;} if(vis[tx][ty]==1) continue;if(Map[tx][ty]!=Map[x][y]) continue;vis[tx][ty]=1;dfs(tx,ty);}
}
int main()
{while(cin>>N>>M){getchar();memset(vis,0,sizeof(vis));memset(Map,0,sizeof(Map));int cnt1=0;int cnt0=0;for(int i=0;i<N;i++){for(int j=0;j<M;j++){char temp=getchar();Map[i][j]=temp-'0';}getchar();}for(int i=0;i<N;i++){for(int j=0;j<M;j++){if(vis[i][j]==0){flag=1;vis[i][j]=1;dfs(i,j);if(Map[i][j]==0&&flag==1)cnt0++;else if(Map[i][j]==1)cnt1++;}}}if(cnt1!=1) cout<<"-1"<<endl;else{if(cnt0==1) cout<<"0"<<endl;else if(cnt0==0) cout<<"1"<<endl;else cout<<"-1"<<endl;}}return 0;}

度度熊的01世界 DFS相关推荐

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

    度度熊的01世界  Accepts: 967  Submissions: 3064  Time Limit: 2000/1000 MS (Java/Others)  Memory Limit: 327 ...

  2. HDU 6113 度度熊的01世界【DFS/Flood Fill】

    度度熊的01世界 Accepts: 967 Submissions: 3064  Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/ ...

  3. HDU 6082 度度熊与邪恶大魔王(01背包)

    Description 度度熊为了拯救可爱的公主,于是与邪恶大魔王战斗起来. 邪恶大魔王的麾下有n个怪兽,每个怪兽有a[i]的生命值,以及b[i]的防御力. 度度熊一共拥有m种攻击方式,第i种攻击方式 ...

  4. 【2012百度之星/初赛上】D:轮子上的度度熊

    描述:百度楼下有一块很大很大的广场.广场上有很多轮滑爱好者,每天轮滑爱好者们都会在广场上做一种叫做平地花式轮滑的表演.度度熊也想像他们一样在轮上飞舞,所以也天天和他们练习. 因为度度熊的天赋,一下就学 ...

  5. 百度之星资格赛1003 度度熊与邪恶大魔王(dp)--2017

    度度熊与邪恶大魔王 Problem Description 度度熊为了拯救可爱的公主,于是与邪恶大魔王战斗起来. 邪恶大魔王的麾下有n个怪兽,每个怪兽有a[i]的生命值,以及b[i]的防御力. 度度熊 ...

  6. hdu6082 度度熊与邪恶大魔王

    http://www.elijahqi.win/2018/01/14/hdu6082-%e5%ba%a6%e5%ba%a6%e7%86%8a%e4%b8%8e%e9%82%aa%e6%81%b6%e5 ...

  7. hdu6376 度度熊剪纸条 思维

    度度熊剪纸条 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Sub ...

  8. HDU - 6082 度度熊与邪恶大魔王(背包变式)

    度度熊与邪恶大魔王 度度熊为了拯救可爱的公主,于是与邪恶大魔王战斗起来. 邪恶大魔王的麾下有n个怪兽,每个怪兽有a[i]的生命值,以及b[i]的防御力. 度度熊一共拥有m种攻击方式,第i种攻击方式,需 ...

  9. 【2012百度之星/初赛下】C:度度熊的礼物

    描述:度度熊拥有一个自己的Baidu空间,度度熊时不时会给空间朋友赠送礼物,以增加度度熊与朋友之间的友谊值.度度熊在偶然的机会下得到了两种超级礼物,于是决定给每位朋友赠送一件超级礼物.不同类型的朋友在 ...

最新文章

  1. Oracle 一些常用的数据字典
  2. Bootstrap4+MySQL前后端综合实训-Day04-PM【PowerDesigner 图形化数据库设计软件(设置依赖关系、自动增长主键、生成sql语句)、SQLyog软件(备份数据库)】
  3. SQL Server分页查询存储过程
  4. 20159320《网络攻防实践》第5周教材总结
  5. Apache Shiro:简化应用程序安全性
  6. CMake和Make——make makefile cmake qmake都是什么,有什么区别?
  7. UI设计不能忽略的字体设计素材
  8. Fixchart图表组件——介绍
  9. 仿真器如何工作以及如何编写? [关闭]
  10. Matlab图像处理系列4———图像傅立叶变换与反变换
  11. win10更改/修改c盘下的用户名/Users
  12. 大数据统计分析、驾驶舱页面,拥有20个例子
  13. AUC(ROC曲线下方的面积大小)
  14. linux误删分区表,恢复被误删的Linux分区表
  15. 农历和阳历互转(c语言)
  16. 华硕PRIME Z390-P主板设置开启虚拟化技术
  17. Excel-查找和引用函数
  18. 利用Nexus搭建私服
  19. 无线连接打印服务器,如何用旧电脑架设无线网络打印服务器
  20. Method has too many Body parameters: public abstract java.util.List com.yun.client.DemandClient.que

热门文章

  1. 织梦CMS被挂马特征汇总
  2. Java知识积累——同时输出到控制台和指定文件,或直接输出到指定文件
  3. 获取页面元素的滚动位置,兼容各浏览器
  4. In Depth和In Action的区别——写在《深入理解C#(第二版)》出版之际
  5. [置顶]千年潜规则一语道破
  6. 调整Linux磁盘分区大小
  7. 关于.net中值类型的方法调用
  8. Visual Studio.NET 2008开发一册通--LINQ从基础到项目实战这本书怎么样
  9. [Asp.net]Uploadify上传大文件,Http error 404 解决方案 - wolfy
  10. Xshell 鼠标选中 中断ctrl+c 问题