【模拟+注意上下左右边界】HDU-1057 A New Growth Industry

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

注解

1、简单模拟。读懂题目意思是关键。
2、输入的第一行是数据组数,下面每组数据分为三部分。第一部分是天数,第二部分是一个长度为16的D数组,第三部分是20乘20的网格。题目意思是,对20乘20的网格的每个点,后一天的细菌数等于当前的细菌数加上D的索引为:当前格子的细菌数加上当前格子的上下左右的细菌数的总和 的细菌数目。且不能大于3,不能小于0。用公式表示更加清晰:
tmp[r][c] = a[r][c] + a[r-1][c] + a[r+1][c] + a[r][c-1] + a[r][c+1];
tmp[r][c] = a[r][c] + D[tmp[r][c]];
tmp[r][c] = min(3, tmp[r][c]);
tmp[r][c] = max(0, tmp[r][c]);
3、注意上下左右,边界条件。(这里有个小trick,我把数组开成了22乘22的数组,也就是在20乘20的外面加了一圈padding,加了一圈0,就可以避免判断如>=0,<20等边界条件了)
4、第一次提交是Presentation Error,后来发现除了最后一组数据,其他组数据结束后都要加个空行!

代码

#include <iostream>
#include <cstring>

using namespace std;

const int ROW = 22;
const int COL = 22;

int main() {
    int T;
    cin>>T;
    while(T--){
        int n;
        cin>>n;
        int D[16];
        for(int k=0; k<16; k++) {
            cin>>D[k];
        }
        int a[ROW][COL];
        memset(a, 0, sizeof(a));
        for(int r=1; r<ROW-1; r++) {
            for(int c=1; c<COL-1; c++) {
                cin>>a[r][c];
            }
        }
        for(int j=0; j<n; j++) {
            int tmp[ROW][COL];
            memset(tmp, 0, sizeof(tmp));
            for(int r=1; r<ROW-1; r++) {
                for(int c=1; c<COL-1; c++) {
                    tmp[r][c] = a[r][c] + a[r-1][c] + a[r+1][c] + a[r][c-1] + a[r][c+1];
                    tmp[r][c] = a[r][c] + D[tmp[r][c]];
                    tmp[r][c] = min(3, tmp[r][c]);
                    tmp[r][c] = max(0, tmp[r][c]);
                }
            }
            for(int r=0; r<ROW; r++) {
                for(int c=0; c<COL; c++) {
                    a[r][c] = tmp[r][c];
                }
            }
        }
        char ans[5] = ".!X#";
        for(int r=1; r<ROW-1; r++) {
            for(int c=1; c<COL-1; c++) {
                cout<<ans[a[r][c]];
            }
            cout<<endl;
        }
        if(T){
            cout<<endl;
        }
    }
    return 0;
}

结果

在这里插入图片描述

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值