1 条题解

  • 0
    @ 2025-4-8 20:31:41

    🧩题解思路

    ✨核心模拟方法:

    初始化格子深度 map;

    对于每个石子,分别模拟其产生的:

    上升波(+1):传播时间 RTR - T

    下降波(-1):传播时间 R(T+2)R - (T + 2)

    每次传播都是曼哈顿距离不超过当前时间的点;

    每次波纹传播遇到河岸时,直接镜像反射对称点;

    所有波纹叠加到水深数组中;

    最后输出对应区域。

    🧮细节处理

    河岸坐标 B1,B2B1, B2 为整条竖线上的格子,所有 yy 坐标均为河岸;

    判断是否越界并跳过;

    输出字符优先级:河岸 'X' > 'o' > '-' > '*';

    坐标需映射为 (i+4,j+4)(i + 4, j + 4) 才能映射到 9×99 \times 9 数组。

    说明:

    时间为 R=4R = 4,两个石子分别在 T=1T = 1T=2T = 2 落下;

    每个石子分别产生的波影响时间可以计算得出;

    最终叠加后显示出 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
    上传者