http://poj.org/problem?id=2434
单纯是看过题人少才来写一下_(:зゝ∠)_毕竟是USACO少数过题量少得可怜的题才不会说是因为从4月底开始翻翻到5月底感觉只有这一题能写一下
没有什么技巧,直接模拟上,因为只要输出(-4,-4)到(4,4)这个矩阵就行了,所以只要在这个9*9的矩阵建一个二维数组表示这个地方的高度,然后直接模拟就行了(比起其他一些强模题还是很和善的),注意遇到墙的反弹和输出中有墙
#include<cstdio> using namespace std; int a[9][9],tem,b1,b2,n,t,x,y,time; bool init(int xx){ if (xx>4)return false; if (xx<-4)return false; return true; } int wz(int xx){ if (xx>b2)return 2; if (xx<b1)return 0; return 1; } void cover(int x,int y,int t,int jj){ int k=wz(x); for (int i=0;i<t;i++){ int xx=x+t-i;int yy=y+i; if (yy>4)break; if (yy<-4)continue; if ((k==0)&&(wz(xx)>0))xx=(b1<<1)-1-xx; if (k==1){ xx=x+(t-i)%((b2-b1-1)<<1); if (xx>=b2)xx=(b2<<1)-xx-1; if (xx<=b1)xx=(b1<<1)-xx+1; } if (init(xx))a[xx+4][yy+4]+=jj; } for (int i=0;i<t;i++){ int xx=x+i;int yy=y-t+i; if (yy>4)break; if (yy<-4)continue; if ((k==0)&&(wz(xx)>0))xx=(b1<<1)-1-xx; if (k==1){ xx=x+i%((b2-b1-1)<<1); if (xx>=b2)xx=(b2<<1)-xx-1; if (xx<=b1)xx=(b1<<1)-xx+1; } if (init(xx))a[xx+4][yy+4]+=jj; } for (int i=0;i<t;i++){ int xx=x-t+i;int yy=y-i; if (yy<-4)break; if (yy>4)continue; if ((k==2)&&(wz(xx)<2))xx=(b2<<1)-xx+1; if (k==1){ xx=x-(t-i)%((b2-b1-1)<<1); if (xx<=b1)xx=(b1<<1)-xx+1; if (xx>=b2)xx=(b2<<1)-xx-1; } if (init(xx))a[xx+4][yy+4]+=jj; } for (int i=0;i<t;i++){ int xx=x-i;int yy=y+t-i; if (yy<-4)break; if (yy>4)continue; if ((k==2)&&(wz(xx)<2))xx=(b2<<1)-xx+1; if (k==1){ xx=x-i%((b2-b1-1)<<1); if (xx<=b1)xx=(b1<<1)-xx+1; if (xx>=b2)xx=(b2<<1)-xx-1; } if (init(xx))a[xx+4][yy+4]+=jj; } } int main(){ scanf("%d%d%d%d",&n,&b1,&b2,&t); if (b2<b1){ tem=b1; b1=b2; b2=tem; } for (int i=1;i<=n;i++){ scanf("%d%d%d",&x,&y,&time); if (time>t)continue; if (time==t){ if ((init(x))&&(init(y)))a[x+4][y+4]++; continue; } if (t-time==1){ cover(x,y,1,1); continue; } if (t-time==2){ cover(x,y,2,1); if ((init(x))&&(init(y)))a[x+4][y+4]--; continue; } cover(x,y,t-time,1); cover(x,y,t-time-2,-1); } for (int i=8;i>=0;i--){ for (int j=0;j<=8;j++)if ((j==b1+4)||(j==b2+4))printf("X"); else if (a[j][i]==0)printf("-"); else if (a[j][i]>0)printf("*"); else printf("o"); printf("\n"); } return 0; }