NanayaSakuya


私信TA

用户名:dotcpp0699642

访问量:189

签 名:

等  级
排  名 10096
经  验 1089
参赛次数 0
文章发表 1
年  龄 0
在职情况 学生
学  校 佛山科学技术学院
专  业

  自我简介:

TA的其他文章

解题思路:
只存在两种草丛,要么单独的小草丛,要么是两块连成一个的草丛。就算有三块以上的小草丛连在一起,也不会算作一个,而是被分成小块再计算,比方说:

====

.##

##.

====

这种形状的就会被算作两个或者三个,具体取决于算法。

由于是从左到右,从上到下遍历,所以当遍历到‘#’时,只需要再检测一下它右边和下边有无‘#’,然后一起消掉就可以了。


注意事项:

有两种算法,一种是先检测下边再检测右边,一种是先检测右边再检测下边。根据不同算法会得出不同的答案。比如:

=======
.####

##.#.

.##.#

..#..

=======

像这种草丛,先下再右的话答案是8,先右再下的话答案是7。

本题的答案应该是选用了先下后右的算法,如果你编写的代码选择了先右后下的算法,那大概率就一片红了。

如果要追求让草丛数量最少的最优算法,那难度应该要上天去,反正我这水平是不行了。


参考代码:

#include<stdio.h>


int main()


{


    int m,n;


    scanf("%d%d",&m,&n);


    char a[102][102]={0};     //建一个足够大的字符矩阵并初始化


    int i=0,j=0;    


    for(i=0;i<m;i++){


         scanf("%s",&a[i][0]);     //一行一行的将题目给的地图输入数组a


    }

    

    int num=0; //草丛计数器 


    for(i=0;i<m;i++){


        for(j=0;j<n;j++){


            if(a[i][j]=='#'){


a[i][j]='0';    //遍历数组,检测到草丛‘#’后将其消掉,随便拿个什么其他字符替换都行


num++;    //草丛+1


if(a[i+1][j]=='#'){


a[i+1][j]='0';    //检测草丛下边有无连接的草丛,也消掉


}else if(a[i][j+1]=='#'){

   

a[i][j+1]='0';    //如果下边没有草丛,就检测草丛右边有无连接的草丛,也消掉。注意如果和下边和右边都有草丛,只能选一个消掉,所以要用else


}


}


}


}


    printf("%d",num);    //输出数量


    return 0;


}


 

0.0分

3 人评分

  评论区

  • «
  • »