UVA572

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("\n");
//        }

        printf("%d\n", cnt);
    }
    return 0;
}

posted on 2021-07-21 16:45  katago  阅读(71)  评论(0编辑  收藏  举报