HDU-4527 小明系列故事——玩转十滴水 模拟

题意:就是平时玩的十滴水游戏,游戏者拥有一定的水滴,能够滴在某些位置,如果一个点上的体积超过了4就会爆炸,向四周传递一个小水滴。该题就是要求模拟这个过程。

分析:这里有一个问题就是不能够使用递归来处理这个过程,因为水滴拥有速度,如果是递归调用的话,那么可能本来应该同时到达某点的水滴变成不同时间到达了。处理该题使用了两个队列,分别模拟当前时刻,和下一时刻,每次从当前时刻取出所有的水滴,再视情况处理加入到下一时刻的队列中。有个地方要注意就是同时到达某一点的水滴加上原来的水滴超过了5那么视作和5等效。

#include <cstdlib>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <queue>
using namespace std;

int mp[10][10]; 
int m;
struct Node {
    int x, y, d;
    Node() {}
    Node(int _x, int _y, int _d) : x(_x), y(_y), d(_d) {}
};
queue<Node>q[2];

int dir[4][2] = {0, 1, 0, -1, 1, 0, -1, 0};

bool judge(int x, int y) {
    if (x < 1 || x > 6 || y < 1 || y > 6) return false;
    else return true;
}

void go(int x, int y) {
    if (mp[x][y] < 4) {
        mp[x][y]++;
        return;
    }
    int cur = 0, nxt = 1, xx, yy;
    mp[x][y] = 0;
    for (int i = 0; i < 4; ++i) {
        xx = x+dir[i][0], yy = y+dir[i][1];
        if (judge(xx, yy)) {
            q[cur].push(Node(xx, yy, i));
        }
    }
    Node tmp;
    while (!q[cur].empty()) {
        while (!q[cur].empty()) {
            tmp = q[cur].front();
            q[cur].pop();
            if (mp[tmp.x][tmp.y] == 0) {
                if (judge(xx=tmp.x+dir[tmp.d][0], yy=tmp.y+dir[tmp.d][1])) {
                    q[nxt].push(Node(xx, yy, tmp.d));
                }
            } else {
                mp[tmp.x][tmp.y]++;
            }
        }
        for (int i = 1; i <= 6; ++i) {
            for (int j = 1; j <= 6; ++j) {
                if (mp[i][j] >= 5) {
                    mp[i][j] = 0;
                    for (int k = 0; k < 4; ++k) {
                        xx = i + dir[k][0], yy = j + dir[k][1];
                        if (judge(xx, yy)) {
                            q[nxt].push(Node(xx, yy, k));
                        }
                    }
                }
            }
        }
        swap(cur, nxt);
    }
}

void print() {
    for (int i = 1; i <= 6; ++i) {
        for (int j = 1; j <= 6; ++j) {
            printf(j == 6 ? "%d\n" : "%d ", mp[i][j]);
        }
    }
}

int main() {
    while (scanf("%d", &mp[1][1]) != EOF) {
        for (int i = 2; i <= 6; ++i) {
            scanf("%d", &mp[1][i]);
        }
        for (int i = 2; i <= 6; ++i) {
            for (int j = 1; j <= 6; ++j) {
                scanf("%d", &mp[i][j]);
            }
        }
        scanf("%d", &m);
        int x, y;
        while (m--) {
            scanf("%d %d", &x, &y);
            go(x, y);
        } 
        print();
        puts("");
    }
    return 0;
}

 

posted @ 2013-11-07 22:22  沐阳  阅读(575)  评论(0编辑  收藏  举报