题面(from luogu)
求细胞数量
一矩形阵列由数字0到9组成,数字1到9代表细胞,细胞的定义为沿细胞数字上下左右若还是细胞数字则为同一细胞,求给定矩形阵列的细胞个数。(1<=m,n<=100)
输入格式:
输入:整数m,n(m行,n列)
矩阵
输出格式:
输出:细胞的个数
样例.in
4 10
0234500067
1034560500
2045600671
0000000089
样例.out
4
题目分析
神似lrj书上的“黑白图像”(同一类型),但此题要注意输入的坑(是连在一起的,要注意分一下)
参考https://blog.csdn.net/c_uizrp_dzjopkl/article/details/81749290
代码
#include <bits/stdc++.h>
using namespace std;
int dx[5]={0,-1,0,0,1}; //四个方向的介值
int dy[5]={0,0,1,-1,0};
int a[109][108],vis[108][109],n,m,ans; //vis数组是用来判断哪些元素算过的,a是存map(地图)的数组
char ch;
void search(int x,int y) //搜索,x,y是当前的坐标
{
if (a[x][y] == 0 || vis[x][y] == 1) return; //走到边上了,或走过了,返回(题中的0性质与所设的围墙一样,所以并同一论了)
else //如果合法,继续向前探
{
vis[x][y]=1; //走过的打标记
for (int i = 1; i <= 4; i++) //向4个方向走
search(x+dx[i],y+dy[i]); //具体去走
//本题vis数组不需要回溯,因为一部分元素只能算一次
}
}
int main()
{
cin>>n>>m; //输入
for (int i = 0; i <= n+1; i++)
for (int j = 0; j <= m+1; j++)
a[i][j] = 0; //加围墙(以免走出去)
for (int i = 1; i <= n; i++)
for (int j = 1; j <= m; j++)
{
cin>>ch; //注意坑点,输入的数都是连在一起的
if (ch != '0') a[i][j] = 1; //因为所有的数都没有太大的关系,所以都可以视为1(更直观),是0在上面赋值过了
}
for (int i = 1; i <= n; i++)
for (int j = 1; j <= m; j++)
vis[i][j] = 0; //vis数组初始化,因为都没有找过
/* for (int i = 1; i <= n; i++)
{
for (int j = 1; j <= m; j++)
cout<<a[i][j]<<' ';
cout<<endl;
} */
for (int i = 1; i <= n; i++) //每一个元素都来一遍
for (int j = 1; j <= m; j++)
{
if (a[i][j] == 1 && vis[i][j] == 0) //当前的元素是一个细胞,且没找过
{
ans++; //找到了一个细胞就+1,因单是一个元素也算,且相互有连接都只算1个
search(i,j); //从当前的坐标开始搜
}
}
cout<<ans; //输出
return 0; //完美的结束程序
}
**蒟蒻新星c_uizrp_dzjopkl原创**