思路:问题为求有多少个不包含0的极大连通块。 按照顺序枚举每一个点,在枚举到一个点时,如果他值不为0,说明找到了一个细胞。每找到一个细胞,就把细胞计数器s+1,并利用search()函数把这个细胞抹杀掉,也就是把这个细胞内的数字全部改写成0。
//
// main.cpp
// shuati
//
// Created by 布屿 on 2019/4/9.
// Copyright © 2019 布屿. All rights reserved.
//
#include <iostream>
using namespace std;
int kx[5]={0, 1, -1, 0, 0};
int ky[5]={0, 0, 0, 1, -1};
char cell[501][501];
int n,m,s=0;
void search(int x,int y)//抹杀细胞
{
if(x>n||y>m||x<1||y<1||cell[x][y]=='0')
return;
cell[x][y]='0';
for(int i=1;i<=4;i++)
{
int x0 = x+kx[i];
int y0 = y+ky[i];
search(x0,y0);
}
}
int main(int argc, const char * argv[]) {
int i,j;//n*m的矩阵
cin>>n>>m;
for(i=1;i<=n;i++)
for(j=1;j<=m;j++)
cin>>cell[i][j];
for(i=1;i<=n;i++)
for(j=1;j<=m;j++)
{
if(cell[i][j]!='0')//找极大连通块
{
s++;
search(i,j);
}
}
cout<<s;
return 0;
}