bzoj1686: [Usaco2005 Open]Waves 波纹

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

//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');
}

猜你喜欢

转载自blog.csdn.net/xumingyang0/article/details/80954585