bzoj1686: [Usaco2005 Open]Waves 波纹

xiaoxiao2021-02-28  44

模拟题 题解顺便赞一下背景图片

//s表示水波是上凸的还是下凹的 //f表示水波移动方向是左还是右 #include<bits/stdc++.h> using namespace std; int i,j,m1,m2,n,r,t,x,y,ti,xx,yy,f,s,mp[9][9]; void ssp(){//水波在m1与m2之间来回盘旋的情况 if (f){ if (yy+ti<m2) yy+=ti; else if (yy+ti==m2) yy+=ti-1; else ti-=m2-yy,yy=m2-1,f=0,ssp(); }else{ if (yy-ti>m1) yy-=ti; else if(yy-ti==m1) yy-=ti-1; else ti-=yy-m1,yy=m1+1,f=1,ssp(); } } void sp(){ if (yy<m1 && !f) yy-=ti; else if (yy>m2 && f) yy+=ti; else if (yy<m1 && f){ if (yy+ti<m1) yy+=ti; else if (yy+ti==m1) yy+=ti-1; else ti-=m1-yy,f=0,yy=m1-1,sp(); }else if (yy>m2 && !f){ if (yy-ti>m2) yy-=ti; else if (yy-ti==m2) yy-=ti-1; else ti-=yy-m2,f=1,yy=m2+1,sp(); }else ti%=(m2-m1-1)*2,ssp(); } void doit(){ for (int i=max(0,x-t);i<=min(8,x+t);i++){ xx=i;yy=y; ti=min(i-(x-t),x+t-i); f=1;sp(); if (0<=yy && yy<9) mp[xx][yy]+=s; if (i==x-t || i==x+t) continue; xx=i;yy=y; ti=min(i-(x-t),x+t-i); f=0;sp(); if (0<=yy && yy<9) mp[xx][yy]+=s; } } int main(){ scanf("%d%d%d%d",&n,&m1,&m2,&r); if (m1>m2) swap(m1,m2); m1+=4;m2+=4; while (n--){ scanf("%d%d%d",&y,&x,&t);//注意 x+=4;y+=4;t=r-t; s=1;doit(); t-=2;if (t>=0) s=-1,doit(); } for (i=8;i>=0;i--,putchar('\n')) for (j=0;j<9;j++) if (j==m1 || j==m2) putchar('X'); else if (mp[i][j]==0) putchar('-'); else if (mp[i][j]>0) putchar('*'); else putchar('o'); }
转载请注明原文地址: https://www.6miu.com/read-2630722.html

最新回复(0)