紫书上面的水题 暴力dfs
题意:
多组案例,每组案例输入一个m行n列的字符矩阵,统计字符‘@’组成多少个连通块。如果两个字符‘@’所在的格子相邻(横、竖或对角线),则说明它们属于同一连通块。
案例:
Sample Input
1 1
*
3 5
*@*@*
**@**
*@*@*
1 8
@@****@*
5 5
****@
*@@*@
*@**@
@@@*@
@@**@
0 0
Sample Output
0
1
2
2
我自己打的代码是只有一组数据,稍微改一下即可
#include<cstdio>
#include<iostream>
using namespace std;
const int MAXN = 1000 + 5;
int m, n, cnt, idx[MAXN][MAXN];
char pic[MAXN][MAXN];
void dfs(int r, int c, int id){
if(r < 0 || r >= m || c < 0 || c >= n) return;
if(idx[r][c] || pic[r][c] != '@') return;
idx[r][c] = id;
for(int i=-1;i<=1;i++)
for(int j=-1;j<=1;j++)
if(i != 0 || j != 0) dfs(r+i, c+j, id); //if条件里面是||,而不是&&;
}
int main(){
scanf("%d%d",&m,&n);
for(int i=0;i<m;i++) scanf("%s",pic[i]);
for(int i=0;i<m;i++)
for(int j=0;j<n;j++)
if(pic[i][j] == '@' && !idx[i][j]) dfs(i, j, ++cnt);
printf("%d",cnt);
return 0;
}