黑白图像(DFS)

输入一个n*n的黑白图像(1表示黑色,0表示白色),任务是统计其中八连块的个数。如果两个黑格子有公共边或者公共顶点,就说它们属于同一个八连块。如图6-11所示的图形有3个八连块。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

图6-11  拥有3个八连块的黑白图形

【分析】

用递归求解:从每个黑格子出发,递归访问它所有的相邻黑格。

int mat[MAXN][MAXN], vis[MAXN][MAXN];
void dfs(int x, int y) {if(!mat[x][y] || vis[x][y])   return;     // 曾经访问过这个格子,或者当前格子是白色vis[x][y] = 1;                          // 标记(x,y)已访问过dfs(x-1,y-1); dfs(x-1,y); dfs(x-1,y+1);dfs(x-1,y);               dfs(x,y+1);dfs(x+1,y-1); dfs(x+1,y); dfs(x+1,y+1); // 递归访问周围的八个格子
}
这里,黑格(x,y)的mat[x][y]为1,白格为0。为了避免同一个格子访问多次,用标志vis[x][y]记录格子(x,y)是否访问过。在输入之前,在迷宫的外面加上一圈虚拟的白格子,见下面的程序。
memset(mat, 0, sizeof(mat)); //所有格子都初始化为白色,包括周围一圈的虚拟格子
memset(vis, 0, sizeof(vis));  // 所有格子都没有访问过
scanf("%d", &n);
for(int i = 0; i < n; i++) {scanf("%s", s);for(int j = 0; j < n; j++)mat[i+1][j+1] = s[j]-'0'; // 把图像往中间移动一点,空出一圈白格子
}


 

接下来,只需不断找黑格,然后调用dfs。从它出发寻找八连块:

int count = 0;
for(int i = 1; i <= n; i++)for(int j = 1; j <= n; j++)if(!vis[i][j] && mat[i][j]) { count++; dfs(i,j); } 
//找到没有访问过的黑格
printf("%d\n", count);


 

完整的程序如下:

#include <stdio.h>
#include <string.h>
const int MAXN = 1000;
int n;int mat[MAXN][MAXN], vis[MAXN][MAXN];
void dfs(int x, int y) {if(!mat[x][y] || vis[x][y])   return; //曾经访问过这个格子,或者当前
格子是白色
vis[x][y] = 1;                        // 标记(x,y)已访问过dfs(x-1,y-1); dfs(x-1,y); dfs(x-1,y+1);dfs(x-1,y);               dfs(x,y+1);dfs(x+1,y-1); dfs(x+1,y); dfs(x+1,y+1); // 递归访问周围的八个格子
}int main() {char s[MAXN + 10];memset(mat, 0, sizeof(mat));  // 所有格子都初始化为白色,包括周围
一圈的虚拟格子memset(vis, 0, sizeof(vis));  // 所有格子都没有访问过scanf("%d", &n);for(int i = 0; i < n; i++) {scanf("%s", s);for(int j = 0; j < n; j++)mat[i+1][j+1] = s[j]-'0'; // 把图像往中间移动一点,空出一圈白格子}int count = 0;for(int i = 1; i <= n; i++)for(int j = 1; j <= n; j++)// 找到没有访问过的黑格if(!vis[i][j] && mat[i][j]) { count++; dfs(i,j); } printf("%d\n", count);return 0;
}


 

上面的函数dfs就是深度优先遍历(Depth-FirstSearch,DFS)的算法,DFS和BFS一样,都是从一个结点出发,按照某种特定的次序访问图中的其他特点。不同的是,BFS使用队列来存放待扩展结点,而DFS使用的是栈。

 

附:我自己理解后敲的代码:

#include <stdio.h>
#include <string.h>
#include<algorithm>
#include<iostream>
#define M  1020
using namespace std;
int n;
int i,j;
char map[M][M];
void dfs(int x,int y)
{if(map[x][y]!='1'||x<0||y<0||x>=n||y>=n)return; //曾经访问过这个格子,或者当前格子是白色else{map[x][y] = '0';                        // 标记(x,y)已访问过dfs(x-1,y-1);dfs(x-1,y+1);dfs(x-1,y);dfs(x,y+1);dfs(x,y-1);dfs(x+1,y-1);dfs(x+1,y);dfs(x+1,y+1); // 递归访问周围的八个格子}
}int main()
{memset(map, 0, sizeof(map));  // 所有格子都没有访问过scanf("%d", &n);for(i=0; i<n; i++)for(j=0; j<n; j++)cin>>map[i][j];int count = 0;for(i = 0; i <n; i++)for(j = 0; j <n; j++){// 找到没有访问过的黑格if(map[i][j]=='1'){dfs(i,j);count++;}}printf("%d\n", count);return 0;
}
/*
6
100100
001010
000000
110000
111000
010100
*/


 

 

转载于:https://www.cnblogs.com/dyllove98/p/3226233.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/295174.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

快速学习使用springmvc、strust2、strust1以及它们的对比

1、如何快速学习springmvc 首先&#xff0c;我们需要在复制spring相关的jar包到web-inf/lib里面去&#xff0c;然后在web.xml里面加入以下代码&#xff0c;相当于springmvc里面的servlet,这里只说明了一些常见的用法&#xff0c;如果要了解springmvc里面的控制器这些详细原理可…

你的输入法都暴露了些啥?

1 三哥对柠檬茶下手了要不要来一杯&#xff1f;▼2 能成功求婚的应该就是真爱了吧&#xff1f;▼3 气泡的花样玩法▼4 很正确&#xff1f;▼5 高手过招&#xff01;牛▼6 幽默中带着点死亡气息▼7 输入法&#xff1a;我暴露了一切▼你点的每个赞&#xff0c;我都认真当成了…

从 ThreadLocal 到 AsyncLocal

前些天跟大佬们在群里讨论如何在不使用构造函数&#xff0c;不增加方法参数的情况下把一个上下文注入到方法内部使用&#xff0c;得出的结论是 AsyncLocal 。感叹自己才疏学浅&#xff0c;居然才知道有 AsyncLocal 这种神器。于是赶紧恶补一下。ThreadLocal 要说 AsyncLocal 还…

Sersync+Rsync 增量实时同步

准备环境&#xff1a; rsync服务器&#xff1a;172.16.3.21sersync2服务器&#xff1a;172.16.3.23一、 rsync服务器先把原来的rsync包删掉yum remove rsync-2.6.8-3.1 -y,然后到http://rsync.samba.org/下载rsync包我用的包如下图所示利用securecrt上传本地[rootacong tongbu1…

浅谈RBF函数

所谓径向基函数 (Radial Basis Function 简称 RBF), 就是某种沿径向对称的标量函数。 通常定义为空间中任一点x到某一中心xc之间欧氏距离的单调函数 , 可记作 k(||x-xc||), 其作用往往是局部的 , 即当x远离xc时函数取值很小。 最常用的径向基函数是高斯核函数 ,形式为 k(||x-xc…

Repeater嵌套绑定Repeater

cs代码&#xff1a; private void RpTypeBind() {//GetQuestionTypeAndCount() 返回一个datatable this.rptypelist.DataSource LiftQuestionCtr.GetQuestionTypeAndCount(); this.rptypelist.DataBind(); } …

字符串之变形数

字符串之变形数 题目:给定2个字符串str1和str2,如果str1和str2出现的字符种类和每个字符出现的个数也一样,那么str1与str2互为变形数。请用函数实现。 例子:str1="123", str2="231" 返回 true 例子:str1="123", str2="2311" 返回…

一个彻底改变世界的思想

全世界只有3.14 % 的人关注了爆炸吧知识因随机性的到来阔然开朗蒙特卡罗赌场蒙特卡罗&#xff08;Monte Carlo&#xff09;是摩纳哥公国&#xff08;Principality of Monaco&#xff09;的一座城市。摩纳哥公国坐落在法国的东南方&#xff0c;总面积为2.02平方公里&#xff0c;…

单元测试 | 如何在Mock时匹配匿名类型参数

前言假设&#xff0c;我们需要单元测试如下方法:public User GetUser(int id) {return Repository.Query<User>(new { ID id }).FirstOrDefault(); }而对于Repository.Query&#xff0c;我们需要进行Mock。怎么实现&#xff1f;不匹配具体参数值如果我们不关心参数的具体…

java中imp结尾,imp java

适配器模式之桥梁模式设计模式目录 http://blog.csdn.net/fenglailea/article/details/52733435风.fox桥梁模式 Bridge Pattern将抽象和实现解耦&#xff0c;使得两者可以独立地变化通用类图组成抽象化角色 Abstraction...文章风来了2016-10-06972浏览量expOracle数据导入导出i…

Cookies

一&#xff0c;前言 Cookies想必所有人都了解&#xff0c; 但是未必所有人都精通。本文讲解了Cookies的各方面知识。 二&#xff0c;基础知识 1.什么是Cookies Cookie 是一小段文本信息&#xff0c;伴随着用户请求和页面在 Web 服务器和浏览器之间传递。Cookie 包含每次用户访问…

用字符串表达式访问JSON数据(java,fastjson)

2019独角兽企业重金招聘Python工程师标准>>> //单元科技-www.ccell.com.cn 技术部,开源 //XML数据有XPATH 如"root/rows[id1]/name" //在JS中JSON数据可以对象方式访问 //java中怎么 用字符串表达式访问JSON数据? 找了很久没有找到,自己写一个,以减小代…

C语言学习

时间&#xff1a;20160302 (1) C语言中&#xff0c;很多标准头文件&#xff0c;这样的头文件好处在于&#xff0c;所有的实现方法都在头文件中进行定义&#xff0c;后期对方法进行修改时&#xff0c;可以只需要改动头文件&#xff0c;就可以了&#xff0c;其他的地方也需要对应…

怎样分辨谁才是朋友圈里的真·贵族?

不是我不明白&#xff0c;这世界变化快但在这个看1分钟视频都要2倍速的世界里有一群人却仍然愿意每天花5分钟阅读2000字以上的文字信息这是多么高贵的一种精神所以高贵的你&#xff0c;值得更好的内容今天我们精选出8个优质公号他们有趣有料、有思想有温度绝对值得你的关注长按…

Android之如何解决Android studio运行出现的HAX kernel modules is not installed

HAX kernel modules is not installed 很久之前,我安装了Android studio,运行时控制台打印出这个,emulator:ERROR:x86 emulation currently requires hardware acceleration! Please ensure Intel HAXM is properly installed and useble, CPU acceleration statis:HAX kern…

Elastic AMP监控.NET程序性能

什么是Elastic AMPElastic APM 是一个应用程序性能监控系统。它可以请求的响应时间、数据库查询、对缓存的调用、外部 HTTP 请求等的详细性能信息&#xff0c;可以实时监控软件服务和应用程序。这可以帮助我们快速查明和修复性能问题。Elastic APM 还会自动收集未处理的错误和异…

java分页的工具类,java分页工具类

PageBean-分页package com.soyea.util;import java.io.Serializable;import java.util.List;/*** 分页工具类*/public class PageBean implements Serializable {private static final long serialVersionUID -8741766802354222579L;private int pageSize5; // 每页显示多少条…

xxx定律-poj-3782

xxx定律 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 1639 Accepted Submission(s): 1303 Problem Description 对于一个数n&#xff0c;如果是偶数&#xff0c;就把n砍掉一半&#xff1b;如果是奇数&#x…

asp.net 检测访问者是iphone,android,web(摘录)

aps.net 可以使用WebFormViewEngine来实现。 参考文章&#xff1a;http://www.hanselman.com/blog/MixMobileWebSitesWithASPNETMVCAndTheMobileBrowserDefinitionFile.aspx 源代码 C#代码 public class MobileCapableWebFormViewEngine : WebFormViewEngine { public…

在Android NDK中使用OpenSSL

从 6.0 开始&#xff0c;Google 要求不要使用系统的 OpenSSL&#xff0c;请见&#xff1a;https://developer.android.com...。因此&#xff0c;请不要再使用本文介绍的方法&#xff0c;请自行交叉编译 OpenSSL 或者使用别人编译好的版本。2017年3月注 由于Java较为容易被反编译…