2020年蓝桥杯模拟赛——长草

题目

【问题描述】
小明有一块空地,他将这块空地划分为 n 行 m 列的小块,每行和每列的长度都为 1。
小明选了其中的一些小块空地,种上了草,其他小块仍然保持是空地。
这些草长得很快,每个月,草都会向外长出一些,如果一个小块种了草,则它将向自己的上、下、左、右四小块空地扩展,这四小块空地都将变为有草的小块。
请告诉小明,k 个月后空地上哪些地方有草。
【输入格式】
输入的第一行包含两个整数 n, m。
接下来 n 行,每行包含 m 个字母,表示初始的空地状态,字母之间没有空格。如果为小数点,表示为空地,如果字母为 g,表示种了草。
接下来包含一个整数 k。
【输出格式】
输出 n 行,每行包含 m 个字母,表示 k 个月后空地的状态。如果为小数点,表示为空地,如果字母为 g,表示长了草。
【样例输入】
4 5
.g…

…g…

2
【样例输出】
gggg.
gggg.
ggggg
.ggg.
【评测用例规模与约定】
对于 30% 的评测用例,2 <= n, m <= 20。
对于 70% 的评测用例,2 <= n, m <= 100。
对于所有评测用例,2 <= n, m <= 1000,1 <= k <= 1000。

思路

stepⅠ:接受输入(需要处理第一行输入结束后的多余字符)
stepⅡ:将地的状态数组s赋值给ans
stepⅢ:遍历s,s有草的时候改变ans的值
stepⅣ:本月结束后,将此时的状态ans赋值给s,若还未到k个月,则转stepⅢ,否则,转stepⅤ
stepⅤ:输出ans

代码实现

#include <stdio.h>
#include <string.h>
#define maxn 1005
char s[maxn][maxn];
char ans[maxn][maxn];

int main(void)
{
    int n = 0,m = 0,k = 0;
    //input
    scanf("%d%d",&n,&m);  //n:row,m:column
    char c = getchar();  //吃掉空格
    while(c != '\n')
    {
        c = getchar();
    }
    for(int i = 0;i < n;i++)
    {
        gets(s[i]);
    }
    scanf("%d",&k);

    //deal
    memcpy(ans, s,sizeof(s));  //赋值到ans中
    while(k--)
    {
        for(int i = 0;i < n;i++)
        {
            for(int j = 0;j < m;j++)
            {
                if(s[i][j] == 'g')
                {
                    //处理边界
                    if(i >= 1)
                    {
                        ans[i-1][j] = 'g';
                    }
                    if(j >= 1)
                    {
                        ans[i][j-1] = 'g';
                    }
                    ans[i+1][j] = 'g';
                    ans[i][j+1] = 'g';
                }
            }
        }
        memcpy(s,ans, sizeof(ans));  //一个月之后把草坪整体的状态传给s,进行迭代
    }

    //output
    for(int i = 0;i < n;i++)
    {
        for(int j = 0;j < m;j++)
        {
            printf("%c",ans[i][j]);
        }
        printf("\n");
    }
    return 0;
}

后记

这是我的第一篇blog,之所以选择写出来,是因为我自己写完之后,想看看大家是怎么写的,却发现大家都是用bfs模板(也许我搜索的方式有问题),我就非常想知道,模板式写法优势在哪儿,因为经常在看算法题解析的时候看到“这是一道典型的bfs模板题”,但我却从未直接套用模板解决过问题,希望碰巧看到我这篇blog的胖友能解决我的疑惑╯^╰
另外由于我没在蓝桥杯练习系统中找到这道题,万一碰巧有胖友在测试的时候发现了错误,也希望能告诉我欧quq

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值