zoukankan      html  css  js  c++  java
  • 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
    " : "%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;
    }
  • 相关阅读:
    java笔记使用线程池优化多线程编程
    java笔记查看和修改线程名称
    java笔记查看和修改线程的优先级
    java笔记策略模式和简单工厂模式
    java笔记用ThreadLocal管理线程,Callable<V>接口实现有返回值的线程
    java笔记枚举总结与详解
    java笔记关于克隆技术
    java笔记反射机制之基础总结与详解
    java笔记使用事件分配线程更新Swing控件
    java笔记关于int和byte[]的转换
  • 原文地址:https://www.cnblogs.com/Lyush/p/3413367.html
Copyright © 2011-2022 走看看