Hdu 5336 XYZ and Drops
2016-07-24 20:34
351 查看
题目链接HDU 5336
题意大概就是类似于十滴水游戏,一开始会从(x,y)点扩散出4个方向的小水珠,题目也会给你一些大水珠,每个大水珠都有他自己目前的水滴数,如果
某个大水珠的水滴数大过4,就会爆掉,并同时向四个方向发射出小水珠,小水珠每秒移动一格,题目问T秒后原本各个大水珠的状态。
这题其实模拟很简单的,但是有个地方坑,就是如果一个小水珠触发爆了某个大水珠,那么此时也刚好到达这个大水珠的小水珠也会消失,相当于多个小水珠同时到达一个大水珠,大水珠爆了,所有此时在这里的小水珠都没有了,不然会多小水珠的。
代码
题意大概就是类似于十滴水游戏,一开始会从(x,y)点扩散出4个方向的小水珠,题目也会给你一些大水珠,每个大水珠都有他自己目前的水滴数,如果
某个大水珠的水滴数大过4,就会爆掉,并同时向四个方向发射出小水珠,小水珠每秒移动一格,题目问T秒后原本各个大水珠的状态。
这题其实模拟很简单的,但是有个地方坑,就是如果一个小水珠触发爆了某个大水珠,那么此时也刚好到达这个大水珠的小水珠也会消失,相当于多个小水珠同时到达一个大水珠,大水珠爆了,所有此时在这里的小水珠都没有了,不然会多小水珠的。
代码
#include <cstdio> #include <cstring> #include <algorithm> #include <iostream> #include <cmath> #include <queue> using namespace std; const int dx[] = {0,0,1,-1}; const int dy[] = {1,-1,0,0}; int drops[110][110][2];//最后一维0表示本来的水珠,1表示什么时候爆了 int n,m,sx,sy,t,kase; struct po { int x,y; }; po ans[110];//记录出答案的顺序 struct drop//模拟小水珠 { int x,y,st,dir; }; void bfs() { queue<drop> q; drop an = {sx,sy,0,0}; q.push(an); an.dir++; q.push(an); an.dir++; q.push(an); an.dir++; q.push(an);//四个方向很简单 while(!q.empty()) { drop v = q.front(); q.pop(); if(v.st >= t) continue; int xn = v.x + dx[v.dir]; int yn = v.y + dy[v.dir]; if(xn <= 0 || yn <= 0 || xn > n || yn > m) continue;//如果小水珠越过地图,自然会被抵消 if(drops[xn][yn][1] == v.st+1) continue; //这里非常坑,就是一个小水珠弄爆了一个大水珠的话,其他同时过来的水珠都会被抵消掉,不然就会多出小水珠来 if(drops[xn][yn][0] != 0 ){ if(drops[xn][yn][0] >= 4){ drops[xn][yn][1] = v.st+1; drops[xn][yn][0] = 0; drop u = {xn,yn,v.st+1,0}; q.push(u); u.dir++; q.push(u); u.dir++; q.push(u); u.dir++; q.push(u); } else if(drops[xn][yn][0]<4) drops[xn][yn][0]++; }else { drop u = {xn,yn,v.st+1,v.dir}; q.push(u); } } } int main() { while(~scanf("%d%d%d%d",&n,&m,&kase,&t)) { int x,y,sizee; memset(drops,0,sizeof(drops)); for(int i=0; i<kase; i++) { scanf("%d%d%d",&x,&y,&sizee); drops[x][y][0] = sizee; ans[i].x = x; ans[i].y = y; } scanf("%d%d",&sx,&sy); bfs(); for(int i=0;i<kase;i++){ if(drops[ans[i].x][ans[i].y][1]){ printf("0 %d\n",drops[ans[i].x][ans[i].y][1]); }else printf("1 %d\n",drops[ans[i].x][ans[i].y][0]); } } return 0; }
相关文章推荐
- 简单的四则运算
- 数的奇偶性
- ACMer博客瀑布流分析
- ACM程序设计大赛题目分类
- 2015年acm国内排名
- 计算字符串最后一个单词长度
- ACM网址
- 1272 小希的迷宫
- 1272 小希的迷宫
- hdu 1250 大数相加并用数组储存
- 矩阵的乘法操作
- 蚂蚁爬行问题
- 蚂蚁爬行问题
- 求两个数的最大公约数【ACM基础题】
- 打印出二进制中所有1的位置
- 杭电题目---一只小蜜蜂
- HDOJ 1002 A + B Problem II (Big Numbers Addition)
- 初学ACM - 半数集(Half Set)问题 NOJ 1010 / FOJ 1207
- 初学ACM - 组合数学基础题目PKU 1833
- POJ ACM 1002