poj 2434;bzoj 1686 [Usaco2005 Open]Waves 波纹
2015-12-10 20:18
369 查看
Description
![](http://www.lydsy.com/JudgeOnline/upload/201401/41.jpg)
![](http://www.lydsy.com/JudgeOnline/upload/201401/42.jpg)
![](http://www.lydsy.com/JudgeOnline/upload/201401/43.jpg)
Input
第1行:四个用空格隔开的整数Pj Bi,B2,R. P(1≤P≤5)表示石子的个数,Bi(-5×100000≤Bi≤5×100000)和B2(-5×100000≤B2≤5×100000)表示两个河堤的z坐标,R(1≤R≤5×100000)表示你要描述湖面多少秒.没有两个石子会在同一时间砸到同一地点,两个河堤一定有不同的坐标,没有石子会砸到河堤上去.第2到P+1行:每行有三个用空格隔开的整数描述了一颗石子,X,K T(-5×100000≤X,K T≤5×100000).X.y表示石子砸的地点的坐标,T表示石子是什么时候砸下去的.
Output
输出是一个9半9的矩阵,中心在(0,0)点.左下点的坐标为(-4,-4),右上点的坐标为(4,4).这个矩阵表现的是R秒时湖面状态.Sample Input
2 4 100 4-3 0 1
0 0 2
Sample Output
--------X-*------X
*-*-*---X
-o-*-*--X
o-----*-X
-o-*-*--X
*-*-*---X
-*------X
--------X
![](https://images2015.cnblogs.com/blog/841250/201512/841250-20151210201505277-1192840078.png)
WA了n+1发……
最后发现我的输出把整个图形上下翻转了……改完就A了……T_T
正确的做饭应该是枚举每个对所求的输出有影响的波,然后直接跑,遇到在俩堤岸之间往返的就求出时间取个模……然而我实在比较挫,直接跑了,反正不会T……
#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"); } }
然后还有修改后的
![](https://images2015.cnblogs.com/blog/841250/201512/841250-20151210204705636-290868352.png)
#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 ssp(){ if (f){ if (ti<m2-yy){ yy+=ti; return; } if (ti<=m2-yy){ yy+=ti-1; return; } ti-=m2-yy; yy=m2-1; f=0;ssp(); }else{ if (ti<yy-m1){ yy-=ti; return; } if (ti<=yy-m1){ yy-=ti-1; return; } 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>m2&&(!f)){ if (ti<yy-m2) yy-=ti;else if (ti<=yy-m2) yy-=ti-1;else ti-=yy-m2,f=1,yy=m2+1,sp(); return; }else if (yy<m1&&f){ if (ti<m1-yy) yy+=ti;else if (ti<=m1-yy) yy+=ti-1;else ti+=m1-yy,f=0,yy=m1-1,sp(); return; }else{ ti%=(m2-m1-1)*2; ssp(); } return; } 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); 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; 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"); } }
相关文章推荐
- shell中“>/dev/null 2>&1”详解
- openstack devstack Bad md5 hash for package
- Linux系统下如何查看CPU个数
- 安装libjpeg库后提示libjpeg.so.8不存在(linux环境)
- Linux学习笔记——举例说,makefile 添加宏定义
- Apache的配置详解,最好的Apache配置文档。
- Linux C学习--getline()函数
- Apache的配置详解,最好的Apache配置文档。
- Linux用户空间与内核空间数据传递的几点理解和总结
- shopxx研究
- nginx location
- CentOs 编译php 遇到的一些问题
- Linux 常用操作
- Linux命令学习笔记(4)----head命令、tail命令
- APACHE POI教程 --java应用程序用POI与Excel交互
- 系统架构之Tomcat7不支持中文cookie
- Ubuntu下关于将普通用户权限提升为root的问题
- Linux 文件夹说明
- 字符设备设备节点创建的两种方法
- 卸载LINUX自带的JDK——linux-jdk-java