zoukankan      html  css  js  c++  java
  • 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
    ",ans);
    }  
  • 相关阅读:
    JS练习
    推断一组数的规律,并填充缺失的数
    IP地址的正则表达式写法
    相比于HTML4,HTML5废弃的元素有哪些?
    关于HTML5和CSS3的几个“新增”
    hdu 3092 简单数论+分组背包dp
    避障
    人工势场法
    A*
    pop 2049-简单bfs
  • 原文地址:https://www.cnblogs.com/wxjor/p/5618379.html
Copyright © 2011-2022 走看看