20612统计八连块

Posted wxjor

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了20612统计八连块相关的知识,希望对你有一定的参考价值。

统计八连块

【试题描述】

       输入一个m行n列的字符矩阵,统计字符“@”组成多少个八连块。如果两个字符“@”所在的格子相邻(横竖或者对角线方向),就说它们属于同一个八连块。例如,下图中有两个八连块。

                         

 

【输入要求】

第一行包括两个正整数m和n,由空格隔开,接下来的m行,每行n个字符,字符只包括“*”和“@”。

 

【输出要求】

一个数,表示八连块的个数

 

【输入实例】

5 5
****@
*@@*@
*@**@
@@@*@
@@**@

 

 

【输出实例】

2

 

【其他说明】

数据范围:0<m,n<101。LJX出品

 

【试题分析】

    很经典的dfs,老师讲的是:一开始先进入图中,然后找到一个@,从此开始搜,如果不是,退回。这时当时刚刚接触dfs时的题,很简单。

 

【代码】

#include<iostream>
#include<cstring>
int mm[101][101],r[101][101];  
void lk(int x, int y)  
{
    if(!mm[x][y]||r[x][y]) return;
    r[x][y]=1;
    lk(x-1,y-1); //周围全搜一遍
	lk(x-1,y+1);
	lk(x+1,y-1);
	lk(x+1,y+1); 
	lk(x-1,y);
	lk(x+1,y);
    lk(x,y-1);
	lk(x,y+1);
}
int main()  
{
    int n,i,j,m,ans=0;  
    char s[101];
    scanf("%d%d",&n,&m);  
    for (i=0;i<n;i++)
    {
        memset(s,0,sizeof(s));  
        scanf("%s",s);  
        for (j=0;j<m;j++)//这里是把整个地图的记录移了一下,从0变成1了
        	if(s[j]==\'@\')mm[i+1][j+1]=1;
            else mm[i+1][j+1]=0;
    }
    for(i=1;i<=n;i++)  
        for(j=1;j<=m;j++)  
            if(!r[i][j]&&mm[i][j])  
            { 
                ans++;
                lk(i,j);
            }
    printf("%d\\n",ans);
}  

以上是关于20612统计八连块的主要内容,如果未能解决你的问题,请参考以下文章

八连块问题:统计图中相相连黑色区域的个数

图1(八连块)

用DFS求连通块(种子填充)

油田(Oil Deposits)-用DFS求连通块

小白书 黑白图像DFS/Flood Fill

用dfs求联通块(UVa572)