HDU 5336 XYZ and Drops(十滴水游戏) 模拟
2015-07-31 09:50
411 查看
题目链接:
hdu5336
题意:
十滴水游戏,具体细节见http://www.4399.com/flash/6356_2.htm
给出所有已固定大水滴 的位置和大小
问在(x,y)处发生爆裂 的T秒后,所有已固定水滴的状态
解题思路:
大水滴会分裂,每一秒保存所有正在飞溅的小水滴(x,y,dir),每个小水滴有三种情况
1 如果飞溅的小水滴碰到了大水滴,则消失,大水滴+1
2 到了一个空的位置,保存至下一秒的 容器
3 出界 消失
同时记录当前秒要爆炸的大水滴,模拟分裂,将分裂的小水滴保存至下一秒的容器
当所有水滴静止,或经过T秒即可得出所有答案
代码:
hdu5336
题意:
十滴水游戏,具体细节见http://www.4399.com/flash/6356_2.htm
给出所有已固定大水滴 的位置和大小
问在(x,y)处发生爆裂 的T秒后,所有已固定水滴的状态
解题思路:
大水滴会分裂,每一秒保存所有正在飞溅的小水滴(x,y,dir),每个小水滴有三种情况
1 如果飞溅的小水滴碰到了大水滴,则消失,大水滴+1
2 到了一个空的位置,保存至下一秒的 容器
3 出界 消失
同时记录当前秒要爆炸的大水滴,模拟分裂,将分裂的小水滴保存至下一秒的容器
当所有水滴静止,或经过T秒即可得出所有答案
代码:
#include<iostream> #include<cstdio> #include<cstring> #include<queue> #define maxn 105 using namespace std; struct node{ int x,y,d; int state; }ans[maxn],head,t; int dir[4][2]={1,0,0,1,-1,0,0,-1}; int map[maxn][maxn]; int id[maxn][maxn]; int n,m,T; int ok(int x,int y) { if(x<1||y<1||x>n||y>m) return 0; return 1; } void work(int x,int y) { map[x][y]=0; queue<node>q[2]; queue<pair<int,int> >qq; pair<int,int>v; int now=0,next=1; int xx,yy,dd; int time =0; for(int i=0;i<4;i++) { t.x=x+dir[i][0]; t.y=y+dir[i][1]; t.d=i; if(ok(t.x,t.y)) q[now].push(t); } while(!q[now].empty()) { time++; if(time>T) return; while(!q[now].empty()) //当前秒 { head=q[now].front(); q[now].pop(); dd=t.d=head.d; if(map[head.x][head.y]==0) //空位置 { t.x=head.x+dir[dd][0]; t.y=head.y+dir[dd][1]; if(ok(t.x,t.y)) q[next].push(t); } else{ //碰到大水滴 map[head.x][head.y]++; if(map[head.x][head.y]>4) qq.push(make_pair(head.x,head.y)); } } while(!qq.empty()) //要爆炸的大水滴 { v=qq.front(); qq.pop(); xx=v.first; yy=v.second; if(map[xx][yy]>4) { map[xx][yy]=0; dd=id[xx][yy]; ans[dd].d=time; ans[dd].state=0; for(int i=0;i<4;i++) { t.x=xx+dir[i][0]; t.y=yy+dir[i][1]; t.d=i; if(ok(t.x,t.y)) q[next].push(t); } } } swap(now,next); } } int main() { // freopen("in.txt","r",stdin); int k,a,b,c; while(~scanf("%d%d%d%d",&n,&m,&k,&T)) { memset(map,0,sizeof(map)); for(int i=1;i<=k;i++) { scanf("%d%d%d",&a,&b,&c); map[a][b]=c; id[a][b]=i; ans[i]=(node){a,b,0,c}; } scanf("%d%d",&a,&b); work(a,b); for(int i=1;i<=k;i++) { printf("%d",ans[i].state); if(ans[i].state==0) printf(" %d\n",ans[i].d); else printf(" %d\n",map[ans[i].x][ans[i].y]); } } return 0; }
相关文章推荐
- LINUX内核GPIO接口解析
- [转]apache下htaccess不起作用,linux,windows详解
- 网站压测工具Webbench源码分析
- calabash
- linux grep命令
- 1. 在cmd输入adb shell时,出现errror: device not found 2.出现permission denied的原因之一
- Linux实现报警自动发邮件
- centos6.6 安装git 2.0
- centos6.4搭建knowlededgeroot-1.0.4知识库平台
- monitoring tomcat with zabbix
- Tomcat安装(MAC)
- 开发实用网站汇总
- Docker 端口映射问题解决
- [LeetCode]Copy List with Random Pointer
- 从Monkey源码里学习几个adb shell命令和monekey日志的查阅方法
- POJ 2186 Popular Cows(强联通分量)
- Apache ab压力测试时出现大量的错误原因分析
- VirtualBox安装linux(CentOS 7)虚拟机
- Linux 操作MySQL常用命令行
- linux初学(十七)之linux管道及重定向