Griseo 的绘画:颜料扩散问题
Griseo 的绘画:颜料扩散问题
Griseo 是黄金庭园的团宠小画家,最近她又开始了她的创作。
由于 Griseo 画工强大,所以她只需要在画布(视为 n*m 的二维平面,坐标起始点为 1)的某处点上一笔,颜料就会依照 Griseo 的想法无尽扩散,颜料的扩散方式是这样的:
- 初始时颜料会向上扩散;
- 每个小时,颜料会根据 Griseo 的想法扩散 s[i] 的距离;
- 当该小时结束后,颜料将分裂成两部分,向左上角以及右上角移动(颜料必须走过 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;
}
原文地址: https://www.cveoy.top/t/topic/oczy 著作权归作者所有。请勿转载和采集!