Griseo 的绘画:颜料扩散问题

Griseo 是黄金庭园的团宠小画家,最近她又开始了她的创作。

由于 Griseo 画工强大,所以她只需要在画布(视为 n*m 的二维平面,坐标起始点为 1)的某处点上一笔,颜料就会依照 Griseo 的想法无尽扩散,颜料的扩散方式是这样的:

  1. 初始时颜料会向上扩散;
  2. 每个小时,颜料会根据 Griseo 的想法扩散 s[i] 的距离;
  3. 当该小时结束后,颜料将分裂成两部分,向左上角以及右上角移动(颜料必须走过 si 的距离才能向两边分裂);

Griseo 想知道在每个小时末颜料的覆盖范围,以此推测画作的模样。

输入

第一行包含三个整数 n 、 m 、 t ,代表画布大小(n 行 m 列)和颜料扩散时间; 第二行包含 t 个整数 s[i],代表第 i 个小时颜料扩散的距离; 第三行包含两个整数 x、y 代表颜料的初始位置。

输出

输出为一行,包含 t 个整数,第 i 个整数代表第 i 个小时末画布上颜料的覆盖范围。

代码示例

#include<bits/stdc++.h>
using namespace std;
const int MAXN=1e3+5;
int n,m,t,s[MAXN],x,y,ans[MAXN][MAXN];
int main(){
    scanf('%d%d%d',&n,&m,&t);
    for(int i=1;i<=t;i++) scanf('%d',&s[i]);
    scanf('%d%d',&x,&y);
    ans[x][y]=1;
    for(int i=1;i<=t;i++){
        for(int j=1;j<=n;j++){
            for(int k=1;k<=m;k++){
                if(ans[j][k]>=i) continue;
                if(s[i]<j) continue;
                int l=sqrt(s[i]*s[i]-j*j);
                if(l<k) continue;
                ans[j][k]=i;
            }
        }
    }
    for(int i=1;i<=t;i++){
        int cnt=0;
        for(int j=1;j<=n;j++){
            for(int k=1;k<=m;k++){
                if(ans[j][k]==i) cnt++;
            }
        }
        printf('%d ',cnt);
    }
    return 0;
}
Griseo 的绘画:颜料扩散问题

原文地址: https://www.cveoy.top/t/topic/oczy 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录