P1451 求细胞数量 题解

文章目录

题目描述

一矩形阵列由数字 0 0 0 到 9 9 9 组成,数字 1 1 1 到 9 9 9 代表细胞,细胞的定义为沿细胞数字上下左右若还是细胞数字则为同一细胞,求给定矩形阵列的细胞个数。

输入格式

第一行两个整数代表矩阵大小 n n n 和 m m m。

接下来 n n n 行,每行一个长度为 m m m 的只含字符 09 的字符串,代表这个 n × m n \times m n×m 的矩阵。

输出格式

一行一个整数代表细胞个数。

样例

样例输入

复制代码
4 10
0234500067
1034560500
2045600671
0000000089

样例输出

复制代码
4

数据范围与提示

对于 100 % 100\% 100% 的数据,保证 1 ≤ n , m ≤ 100 1 \le n,m \le 100 1≤n,m≤100。

题目传送门

思路及部分实现

笔者直接考虑用搜索完成此题,只需在搜索过程中把经过的每一点标记避免重复计算同一细胞即可。

  • 枚举每个点,如果当前点没有被搜索过(即没被标记过)就将计数器加一,然后从当前点展开搜索
  • 反之,如果当前点被搜索过,直接进入下一次循环,无需做特殊处理

代码实现如下:

cpp 复制代码
for(int i=1;i<=n;i++)
	for(int j=1;j<=m;j++)
		if(!fl[i][j]) cnt++,search(i,j);

笔者对于这道题更倾向于深度优先搜索 DFS \text{DFS} DFS,当然用广度优先搜索 BFS \text{BFS} BFS 也完全没问题。代码实现见完整代码。

完整代码

第一种,深度优先搜索 写法。以下代码在洛谷评测中 30 ms 30\text{ms} 30ms 通过此题。

cpp 复制代码
#include<iostream>
using namespace std;
int n,m;
bool fl[101][101];
void dfs(int x,int y){
	if(fl[x][y]||x<1||y<1||x>n||y>m) return ;
	fl[x][y]=true;
	dfs(x,y+1),dfs(x,y-1),dfs(x+1,y),dfs(x-1,y);
}
int main()
{
	int cnt=0;
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++)
		for(int j=1;j<=m;j++){
			char ch;
			scanf(" %c",&ch);
			if(ch=='0') fl[i][j]=true;
		}
	for(int i=1;i<=n;i++)
		for(int j=1;j<=m;j++)
			if(!fl[i][j]) cnt++,dfs(i,j);
	printf("%d",cnt);
	return 0;
} 

第二种,广度优先搜索 写法。以下代码在洛谷评测中 34 ms 34\text{ms} 34ms 通过此题。

cpp 复制代码
#include<queue>
#include<iostream>
using namespace std;
struct node{
	int x,y;
};
int n,m;
bool fl[101][101];
void bfs(int o,int r){
	queue<node> q;
	q.push((node){o,r});
	while(!q.empty()){
		node T=q.front();q.pop();
		if(T.x<1||T.y<1||T.x>n||T.y>m||fl[T.x][T.y]) continue;
		fl[T.x][T.y]=true;
		q.push((node){T.x+1,T.y});
		q.push((node){T.x-1,T.y});
		q.push((node){T.x,T.y+1});
		q.push((node){T.x,T.y-1});
	}
}
int main()
{
	int cnt=0;
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++)
		for(int j=1;j<=m;j++){
			char ch;scanf(" %c",&ch);
			if(ch=='0') fl[i][j]=true;
		}
	for(int i=1;i<=n;i++)
		for(int j=1;j<=m;j++)
			if(!fl[i][j]) cnt++,bfs(i,j);
	printf("%d",cnt);
	return 0;
} 
相关推荐
灵晔君13 小时前
【C++】二叉搜索树
开发语言·c++
大鱼>13 小时前
宠物异常行为预警系统:边缘计算与实时检测
人工智能·深度学习·算法·iot·宠物
鱼子星_13 小时前
【C++】内存管理:内存分布,new/delete的使用及细节处理,new/delete的底层,定位new表达式
开发语言·c++·笔记
鱼子星_14 小时前
【C++】string(上):string的基本使用
c++·笔记·字符串
米尔的可达鸭14 小时前
深入操作系统 Socket 底层:套接字控制块、FD映射、阻塞IO核心完整实现
arm开发·数据结构·websocket·网络协议·算法·架构·安全架构
tachibana215 小时前
hot100 课程表(207)
java·数据结构·算法·leetcode
神仙别闹15 小时前
编写基于C++ Huffman 算法的无损压缩程序和解压程序
java·c++·算法
炸膛坦客15 小时前
单片机/C/C++八股:(二十三)#define 和 typedef 的区别
c语言·c++·单片机
大鱼>15 小时前
宠物活动轨迹追踪系统:GPS/BDS+UWB+BLE多定位融合方案
人工智能·深度学习·算法·iot·宠物
闲研随记15 小时前
【文献阅读 ICML 2026】RL算法:R2VPO
论文阅读·人工智能·算法·强化学习·icml·rl算法