Hdu 5336 XYZ and Drops

题目链接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;

}
发布了40 篇原创文章 · 获赞 7 · 访问量 1万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章