当前位置: 首页 > news >正文

[dfs] 图案计数

图案计数

题目描述

一张画布里有n行*m列个格子,其中有的格子里有颜色填充,有的格子是空的没有颜色填充。现在需要你写一个程序来数出画布里边有颜色填充的格子构成了多少个图案,其中图案的定义为:
如果两个有颜色的格子边相邻或者角相邻(即横、纵两个方向上的位置差都不超过1),则他们属于同一个图案。

关于输入

第一行为两个整数n和m(1<=n, m<=200)。
之后的n行,每行为一个长度为m的字符串,构成了整个画布。字符串中,#表示颜色,-表示空白。

关于输出

一个整数,表示图案的个数

例子输入
19 48
------------------------------------------------
---####-----#-----#----------------------####---
--######----#-----#---------------------######--
-########--#-#---#-#####--#-##-##---#--########-
-###--###--#-#---#-#----#-##-##--#--#--###--###-
-###--###--#--#-#--######-#--#---#-#---###--###-
-########--#--#-#--#------#--#----##---########-
--######---#---#---######-#--#-----#----######--
---####----------------------------#-----####---
----------------------------------#-------------
------------------------------------------------
---###--#--------#------#-----------------------
--#---#-#---------------#-----------------------
-#------#-##--#-##--##-###-#-##-###--###-#--##--
-#------##--#-##-#-#----#--##--#---##---##-#----
-#------#---#-#--#--#---#--#---#---##----#--#---
--#---#-#---#-#--#---#--#--#---#---##---##---#--
---###--#---#-#--#-##---#--#---#---#-###-#-##---
------------------------------------------------
例子输出
12
解题分析

这是一个典型的深度优先搜索(DFS)问题。在这个问题中,我们需要遍历整个画布,对每个有颜色的格子进行深度优先搜索,找出所有与其相邻的有颜色格子,并将它们标记为已访问。每次新的DFS搜索都代表一个新的图案。在实现这个算法时,我们需要注意防止对同一个格子进行多次访问。

代码实现
#include<stdio.h>#define MAX 200char grid[MAX][MAX];
int visited[MAX][MAX];
int dx[] = {-1, 0, 1, 0, -1, -1, 1, 1};
int dy[] = {0, 1, 0, -1, -1, 1, -1, 1};
int n, m;void dfs(int x, int y) {visited[x][y] = 1;for (int i = 0; i < 8; i++) {int nx = x + dx[i];int ny = y + dy[i];if (nx >= 0 && nx < n && ny >= 0 && ny < m && grid[nx][ny] == '#' && !visited[nx][ny]) {dfs(nx, ny);}}
}int main() {scanf("%d%d", &n, &m);for (int i = 0; i < n; i++) {scanf("%s", grid[i]);}int count = 0;for (int i = 0; i < n; i++) {for (int j = 0; j < m; j++) {if (grid[i][j] == '#' && !visited[i][j]) {dfs(i, j);count++;}}}printf("%d\n", count);return 0;
}

相关文章:

  • 使用postman请求x5接口
  • 回归预测 | MATLAB实现基于LightGBM算法的数据回归预测(多指标,多图)
  • BLIP和BLIP2
  • 后端项目连接数据库-添加MyBatis依赖并检测是否成功
  • mybatis的一级缓存和二级缓存
  • Mysql分区表
  • 从源代码出发,Jenkins 任务排队时间过长问题的解决过程
  • 删除容器挂载卷打包容器镜像并传到阿里云
  • C#8.0本质论第十六章--使用查询表达式的LINQ
  • 强推六款满分AI写作工具,需要自取
  • 输出SearchFacesResponse对象的JSON格式字符串回包乱码解决方案
  • 21、Resnet50 中包含哪些算法?
  • vite的使用
  • 开启gitlab中远程连接pgsql
  • 【Python-随笔】使用Python实现屏幕截图
  • Angular4 模板式表单用法以及验证
  • css属性的继承、初识值、计算值、当前值、应用值
  • FineReport中如何实现自动滚屏效果
  • HTTP--网络协议分层,http历史(二)
  • JavaSE小实践1:Java爬取斗图网站的所有表情包
  • js算法-归并排序(merge_sort)
  • nodejs调试方法
  • Selenium实战教程系列(二)---元素定位
  • uva 10370 Above Average
  • windows-nginx-https-本地配置
  • 安装python包到指定虚拟环境
  • 从地狱到天堂,Node 回调向 async/await 转变
  • 对超线程几个不同角度的解释
  • 聊一聊前端的监控
  • 山寨一个 Promise
  • 小程序开发之路(一)
  • 1.Ext JS 建立web开发工程
  • RDS-Mysql 物理备份恢复到本地数据库上
  • #ubuntu# #git# repository git config --global --add safe.directory
  • #控制台大学课堂点名问题_课堂随机点名
  • #我与Java虚拟机的故事#连载11: JVM学习之路
  • (09)Hive——CTE 公共表达式
  • (175)FPGA门控时钟技术
  • (C语言)字符分类函数
  • (M)unity2D敌人的创建、人物属性设置,遇敌掉血
  • (十八)用JAVA编写MP3解码器——迷你播放器
  • (转)程序员技术练级攻略
  • (转)可以带来幸福的一本书
  • (转载)OpenStack Hacker养成指南
  • (转载)虚幻引擎3--【UnrealScript教程】章节一:20.location和rotation
  • (自适应手机端)响应式新闻博客知识类pbootcms网站模板 自媒体运营博客网站源码下载
  • .chm格式文件如何阅读
  • .NET core 自定义过滤器 Filter 实现webapi RestFul 统一接口数据返回格式
  • .NET Core工程编译事件$(TargetDir)变量为空引发的思考
  • .Net Framework 4.x 程序到底运行在哪个 CLR 版本之上
  • .net refrector
  • .Net 代码性能 - (1)
  • .net 设置默认首页
  • .NET 依赖注入和配置系统
  • .NET/C# 如何获取当前进程的 CPU 和内存占用?如何获取全局 CPU 和内存占用?