先放上这题的链接 P1451 求细胞数量
写完这题想到我之前写的题目都不是很记得了,决定在博客写一个做题笔记,从这题开始将我做的每一题都写一个题解
所以,现在进入正题
这道题一看就知道,是dfs判断连通块
本来做这个题目是想练习dfs,但是由于dfs并不是很会,所以还是写的暴力搜索,可能是数据比较水,居然过了
我的思路很简单,就是递归搜索整个矩阵,寻找不为0的坐标,找到就置为0,搜到边界就返回,然后计数器加一
上代码
#include<iostream>
#include<cstdio>
using namespace std;
char a[100][100]; //存矩阵
int ans;
int n,m;
void sousuo(int x,int y){
if(x<1||y<1||x>m||y>n)
return ; //判断边界,然后将上下左右四个点都扫一遍
if(a[x][y+1]!='0'){
a[x][y+1]='0'; //遇到不为0的就置为0
sousuo(x,y+1); //递归
}
if(a[x+1][y]!='0'){
a[x+1][y]='0';
sousuo(x+1,y);
}
if(a[x-1][y]!='0'){
a[x-1][y]='0';
sousuo(x-1,y);
}
if(a[x][y-1]!='0'){
a[x][y-1]='0';
sousuo(x,y-1);
}
}
int main(){
cin>>m>>n;
for(int i=1;i<=m;i++){ //矩阵输入,因为没有空格,所以用char类型二维数组
for(int j=1;j<=n;j++){
cin>>a[i][j];
}
}
for(int i=1;i<=m;i++){
for(int j=1;j<=n;j++){
if(a[i][j]!='0'){
a[i][j]='0'; //开始搜索的那个点要先置为0,防止重复
ans++; //计数器计数
sousuo(i,j);
}
}
}
cout<<ans;
return 0;
}
不会算时间复杂度,但是感觉如果数据狠一点就过不了,毕竟题目数据范围矩阵最大100*100
如果各位想再次练习此类题目,可以戳下面的链接,练习另一道类似的题(其实就是推荐我的另一篇题解 )
PS:这里再贴一个题解里看到的int数组的矩阵输入
for(c=1;c<=m;c++)
{
for(d=1;d<=n;d++)
{
scanf("%1d",&mapp[c][d]); //scanf可以控制读入的位数
}
}