https://www.luogu.com.cn/problem/UVA572#submit
// 题意:输入一个字符矩阵,统计字符@组成多少个四连块
// 可以用floodfill方法, 这边设置了两个数组,pic是原始图像,不去更改他。 idx为dfs用的标记图像,
例如:
原始图像:
****@
*@@*@
*@**@
@@@*@
@@**@
标记后图像:
00001
02201
02001
22201
22001
#include <cstdio>
#include <cstring>
const int maxn=100+5;
int m,n;
char pic[maxn][maxn];
int idx[maxn][maxn];
void dfs(int r, int c, int cnt)
{
idx[r][c]=cnt;
for(int i=-1;i<=1;i++)
for(int j=-1;j<=1;j++)
{
if(i==0&&j==0) continue;
int nr=r+i;
int nc=c+j;
if(nr>=0 && nr<m && nc>=0 && nc<n && idx[nr][nc]==0 && pic[nr][nc]=='@')
dfs(nr, nc, cnt);
}
}
int main()
{
while(scanf("%d %d", &m, &n)==2 && m && n)
{
for(int i = 0; i < m; i++) scanf("%s", pic[i]);
memset(idx, 0, sizeof(idx));
int cnt=0;
for(int i=0;i<m;i++)
for(int j=0;j<n;j++)
{
if(idx[i][j]==0 && pic[i][j] == '@')
{
dfs(i,j, ++cnt);
}
}
//打印idx图像
// for(int i = 0; i < m; i++)
// {
// for(int j=0;j<n;j++)
// printf("%d", idx[i][j]);
// printf(" ");
// }
printf("%d ", cnt);
}
return 0;
}