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

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秒即可得出所有答案

代码:

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