洛谷 P1451 求细胞数量
题目描述
一矩形阵列由数字 00 到 99 组成,数字 11 到 99 代表细胞,细胞的定义为沿细胞数字上下左右若还是细胞数字则为同一细胞,求给定矩形阵列的细胞个数。
输入格式
第一行两个整数代表矩阵大小 nn 和 mm。
接下来 nn 行,每行一个长度为 mm 的只含字符 0
到 9
的字符串,代表这个 n \times mn×m 的矩阵。
输出格式
一行一个整数代表细胞个数。
输入输出样例
4 10 0234500067 1034560500 2045600671 0000000089
4
分析
基础bfs染色题目,将字符串转化为整型01图来标记,遍历每一个点,如果这个点没有被标记,则代表整个区块没有被标记,从当前点染色整个区块。
代码
#include<bits/stdc++.h> using namespace std; int n,m; char mp[105][105]; int mark[105][105]; int ans; int move_x[4]={0,-1,0,1}; int move_y[4]={1,0,-1,0}; struct Point { int xx; int yy; Point(int _xx,int _yy): xx(_xx),yy(_yy){} }; int main() { cin>>n>>m; for(int i=1;i<=n;i++) { for(int j=1;j<=m;j++) { cin>>mp[i][j]; if(mp[i][j]=='0') mark[i][j]=1;//打好标记不能走 } } for(int i=1;i<=n;i++) { for(int j=1;j<=m;j++) { if(mark[i][j]==1) continue;//走不了 queue <Point> node; node.push(Point(i,j)); mark[i][j]=1;//染色 ans++;//区块之前没有被染色,答案+1 while(!node.empty())//染色当前点所在区块 { Point now_node=node.front(); node.pop(); for(int k=0;k<4;k++) { Point new_node=Point(now_node.xx+move_x[k],now_node.yy+move_y[k]); if(mark[new_node.xx][new_node.yy]!=1&&new_node.xx<=n&&new_node.xx>=1&&new_node.yy>=1&&new_node.yy<=m) { mark[new_node.xx][new_node.yy]=1; node.push(new_node); } } } } } cout<<ans<<endl; return 0; }