深度优先遍历解决连通域求解问题-python实现

问题描述

在一个矩形网格中每一个格子的颜色或者为白色或者为黑色。任意或上、或下、或左、或右相邻同为黑色的格子组成一个家族。家族中所有格子的数量反映家族的大小。要求找出最大家族的家族大小(组成最大家族的格子的数量)并统计出哪些点属于哪一族。例如下图中最大家族的格子数量为 8。

求解思路

遍历矩形网格,找到一个没有被标记的黑块作为入口进行上下左右的搜索并不断的扩散,每找到一个就进行族标记,最后输出相应的族标记即可,使用深度优先算法来做搜索比较简单。

代码实现

#!/usr/bin/python
#encoding=utf8

table = [[0,0,1,0,1,1,1,0],[0,0,1,0,0,1,1,0],[0,1,1,0,1,1,1,0],[0,0,1,0,1,0,0,0],[0,0,0,0,0,1,1,0],[0,0,0,0,1,1,1,0]]rows = len(table)
cols = len(table[0])label_table = []
for i in range(rows):col = cols*[0]label_table.append(col)def show(table):rows = len(table)cols = len(table[0])for i in range(rows):for j in range(cols):print(table[i][j], end=" ")print()def dfs(i, j, mask):if i<0 or i>=rows or j<0 or j>=cols or \label_table[i][j]!=0 or \table[i][j]!=1:return 0label_table[i][j] = maskret = 1#left right up down searchret+=dfs(i, j-1, mask)ret+=dfs(i, j+1, mask)ret+=dfs(i-1, j, mask)ret+=dfs(i+1, j, mask)return retif __name__ == "__main__":print("original table:")show(table)res={}print("++++++++++++++++++++")print("label table")mask = 1for i in range(rows):for j in range(cols):if table[i][j] == 1 and label_table[i][j] == 0:ret = dfs(i,j, mask)res[mask] = retmask+=1show(label_table)print("++++++++++++++++++++")print("results:")sorted_res = [(k, res[k]) for k in sorted(res, key=res.get, reverse=True)]max_grp = sorted_res[0][0]print("max group num: %d"%sorted_res[0][1])for i in range(rows):for j in range(cols):if label_table[i][j] == max_grp:print("point (%d, %d) belongs to max group: %d"%(i,j,max_grp))#output
# original table:
# 0 0 1 0 1 1 1 0
# 0 0 1 0 0 1 1 0
# 0 1 1 0 1 1 1 0
# 0 0 1 0 1 0 0 0
# 0 0 0 0 0 1 1 0
# 0 0 0 0 1 1 1 0
# ++++++++++++++++++++
# label table
# 0 0 1 0 2 2 2 0
# 0 0 1 0 0 2 2 0
# 0 1 1 0 2 2 2 0
# 0 0 1 0 2 0 0 0
# 0 0 0 0 0 3 3 0
# 0 0 0 0 3 3 3 0
# ++++++++++++++++++++
# results:
# max group num: 9
# point (0, 4) belongs to max group: 2
# point (0, 5) belongs to max group: 2
# point (0, 6) belongs to max group: 2
# point (1, 5) belongs to max group: 2
# point (1, 6) belongs to max group: 2
# point (2, 4) belongs to max group: 2
# point (2, 5) belongs to max group: 2
# point (2, 6) belongs to max group: 2
# point (3, 4) belongs to max group: 2

 

转载于:https://www.cnblogs.com/walter-xh/p/10171597.html

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

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

相关文章

字符串进阶

C风格字符串 1、字符串是用字符型数组存储的&#xff0c;字符串要求其尾部以’\0’作为结束标志。如&#xff1a; char string[ ]”C programming language”; 用sizeof来测string长度为25个字节&#xff0c;而实际串本身长度(含空格)为24个字节&#xff0c;多出来的一个就是…

flask上传excel文件,无须存储,直接读取内容

运行环境python3.6 import xlrd from flask import Flask, requestapp Flask(__name__)app.route("/", methods[POST, GET]) def filelist1():print(request.files)file request.files[file]print(file, type(file), file)print(file.filename) # 打印文件名f …

分布式 ID的 9 种生成方式

一、为什么要用分布式 ID&#xff1f; 在说分布式 ID 的具体实现之前&#xff0c;我们来简单分析一下为什么用分布式 ID&#xff1f;分布式 ID 应该满足哪些特征&#xff1f; 1、什么是分布式 ID&#xff1f; 拿 MySQL 数据库举个栗子&#xff1a; 在我们业务数据量不大的时…

spring boot Redis集成—RedisTemplate

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 Spring boot 基于Spring, Redis集成与Spring大同小异。 文章示例代码均以前篇笔记为基础增加修改&#xff0c;直接上代码&#xff1a;…

QtCreator无法编辑源文件

在Qt Creator中新建工程&#xff0c;添加现有C源文件&#xff0c;有的源文件可以编辑&#xff0c;有的源文件编辑不了&#xff0c;发现无法编辑的源文件有一个共同特点&#xff0c;即其中都包含中文&#xff0c;且中文出现乱码&#xff0c;于是&#xff0c;点击Qt Creator菜单栏…

Unicode简介和使用

一、Unicode简介 在第一章中&#xff0c;我已经预告&#xff0c;C语言中在Microsoft Windows程序设计中扮演着重要角色的任何部分都会讲述到&#xff0c;您也许在传统文字模式程序设计中还尚未遇到过这些问题。宽字符集和Unicode差不多就是这样的问题。 简单地说&#xff0c;…

webpack4.x 模块化浅析-CommonJS

先看下webpack官方文档中对模块的描述&#xff1a; 在模块化编程中&#xff0c;开发者将程序分解成离散功能块(discrete chunks of functionality)&#xff0c;并称之为模块。每个模块具有比完整程序更小的接触面&#xff0c;使得校验、调试、测试轻而易举。 精心编写的模块提供…

设计模式--抽象工厂(个人笔记)

一、抽象工厂的应用场景以及优缺点 1 应用场景&#xff1a; 如果系统需要多套的代码解决方案&#xff0c;并且每套的代码解决方案中又有很多相互关联的产品类型&#xff0c;并且在系统中我们可以相互替换的使用一套产品的时候可以使用该模式&#xff0c;客户端不需要依赖具体的…

利用阿里云OSS对文件进行存储,上传等操作

--pom.xml加入阿里OSS存储依赖 <!--阿里云OSS存储--> <dependency><groupId>com.aliyun.oss</groupId><artifactId>aliyun-sdk-oss</artifactId><version>2.8.3</version> </dependency> --配置阿里云oss相关常量参数 /…

Java并发编程之ThreadGroup

ThreadGroup是Java提供的一种对线程进行分组管理的手段&#xff0c;可以对所有线程以组为单位进行操作&#xff0c;如设置优先级、守护线程等。 线程组也有父子的概念&#xff0c;如下图&#xff1a; 线程组的创建 1 public class ThreadGroupCreator {2 3 public static v…

springboot 缓存ehcache的简单使用

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 步骤&#xff1a; 1. pom文件中加 maven jar包&#xff1a; <!-- ehcache 缓存 --><dependency><groupId>net.sf.eh…

Spring boot + mybatis plus 快速构建项目,生成基本业务操作代码。

---进行业务建表&#xff0c;这边根据个人业务分析&#xff0c;不具体操作 --加入mybatis plus pom依赖 <!-- mybatis-plus 3.0.5--> <dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId>&l…

给手机浏览器减负 轻装上阵才能速度制胜

随着手机浏览器的发展&#xff0c;浏览器已经变得臃肿不堪&#xff0c;各种“功能”系于一身&#xff0c;有广告、社区、乐园等等&#xff0c;我们真的需要它们吗&#xff1f;如何才能让浏览器做到轻装上阵&#xff0c;又能高效满足我们需求呢&#xff1f; 过多“功能”的浏览器…

653. Two Sum IV - Input is a BST

题目来源&#xff1a; 自我感觉难度/真实难度&#xff1a; 题意&#xff1a; 分析&#xff1a; 自己的代码&#xff1a; class Solution(object):def findTarget(self, root, k):""":type root: TreeNode:type k: int:rtype: bool"""Allself.InO…

解决 dubbo问题:Forbid consumer 192.xx.xx.1 access service com.xx.xx.xx.rpc.api.xx from registry 116.xx1

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 我的情况是&#xff1a; 原本我把服务放在A工程中&#xff0c;后来改到B工程中了&#xff0c;所以原来的服务不存在了&#xff0c;查不…

vue学习:7、路由跳转

2019独角兽企业重金招聘Python工程师标准>>> <body><div id"app"></div></body><script type"text/javascript">var Login {template: <div>我是登陆界面</div>};var Register {template: <div…

Spring Retry 重试机制实现及原理

概要 Spring实现了一套重试机制&#xff0c;功能简单实用。Spring Retry是从Spring Batch独立出来的一个功能&#xff0c;已经广泛应用于Spring Batch,Spring Integration, Spring for Apache Hadoop等Spring项目。本文将讲述如何使用Spring Retry及其实现原理。 背景 重试&…

inline 内联函数详解 内联函数与宏定义的区别

一、在C&C中   一、inline 关键字用来定义一个类的内联函数&#xff0c;引入它的主要原因是用它替代C中表达式形式的宏定义。表达式形式的宏定义一例&#xff1a;#define ExpressionName(Var1,Var2) ((Var1)(Var2))*((Var1)-(Var2))为什么要取代这种形式呢&#xff0c;且…

Oracle序列更新为主键最大值

我们在使用 Oracle 数据库的时候&#xff0c;有时候会选择使用自增序列作为主键。但是在开发过程中往往会遇到一些不规范的操作&#xff0c;导致表的主键值不是使用序列插入的。这样在数据移植的时候就会出现各种各样的问题。当然数据库主键不使用序列是一种很好的方式&#xf…

dubbo forbid service的解决办法

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 017-05-31 10:36:54.523 [http-nio-8080-exec-5] ERROR c.h.pdl.web.APIExceptionHandler - Unknown Exception, URI /payday-loan-co…