您的位置:首页 > 运维架构

Hdu 5336 XYZ and Drops

2016-07-24 20:34 351 查看
题目链接HDU 5336

题意大概就是类似于十滴水游戏,一开始会从(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;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  acm