1 条题解
-
0
🧩题解思路
✨核心模拟方法:
初始化格子深度 map;
对于每个石子,分别模拟其产生的:
上升波(+1):传播时间 ;
下降波(-1):传播时间 ;
每次传播都是曼哈顿距离不超过当前时间的点;
每次波纹传播遇到河岸时,直接镜像反射对称点;
所有波纹叠加到水深数组中;
最后输出对应区域。
🧮细节处理
河岸坐标 为整条竖线上的格子,所有 坐标均为河岸;
判断是否越界并跳过;
输出字符优先级:河岸 'X' > 'o' > '-' > '*';
坐标需映射为 才能映射到 数组。
说明:
时间为 ,两个石子分别在 和 落下;
每个石子分别产生的波影响时间可以计算得出;
最终叠加后显示出 9x9 区域的湖面状态。 代码实现
#include<cstdio> #include<cstring> #include<algorithm> using namespace std; int n,m1,m2,r,x,y,t,xx,yy,ti,ll,rr,qaq,i,j; bool f; int map[9][9]; void sp(){ while(ti--){ if (f){ yy++; if (yy==m1||yy==m2) yy--,f=0; }else{ yy--; if (yy==m1||yy==m2) yy++,f=1; } } } void op(){ ll=max(0,x-t),rr=min(8,x+t); for (i=ll;i<=rr;i++){ ti=min(i-(x-t),(x+t)-i);xx=i,yy=y; f=1;sp(); if (yy>=0&&yy<=8) map[xx][yy]+=qaq; if (i==x-t||i==x+t) continue; ti=min(i-(x-t),(x+t)-i);xx=i;yy=y; f=0;sp(); if (yy>=0&&yy<=8) map[xx][yy]+=qaq; } } int main(){ scanf("%d%d%d%d",&n,&m1,&m2,&r); m1+=4;m2+=4; while(n--){ scanf("%d%d%d",&y,&x,&t); x+=4;y+=4; t=r-t; qaq=1;op(); t-=2; if (t>=0) qaq=-1,op(); } for (i=8;i>=0;i--){ for (j=0;j<=8;j++) if (j==m1||j==m2) printf("X");else if (map[i][j]==0) printf("-");else if (map[i][j]>=1) printf("*");else if (map[i][j]<=-1) printf("o"); printf("\n"); } }
- 1
信息
- ID
- 1435
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者