HDOJ 1057 模拟 水

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1057

这题首先考查理解题意,我把要点总结一下。

  1. 有20*20的菌落(即总共有400个格子的菌落),每个小格内菌落的数量用0~3四个等级描述。
  2. 假设K为某个菌落,及其上下左右四个菌落的数量之和。每过一天,每个格子内的菌落的数量的变化等于DNA[K]。
  3. 每个格子内的菌落的数量永远在0~3之间。
#include <algorithm>
#include <iostream>
using namespace std;

const int SIZE = 20;
const int DNALEN = 16;

//前一天和后一天的菌落情况
int colony[2][SIZE][SIZE];
int DNA[DNALEN];

int getSum(int curDay, int x, int y)
{
    //上,下,左,右
    int direction_x[4] = {-1, 1, 0, 0,};
    int direction_y[4] = {0, 0, -1, 1};
    int xx, yy;
    int sum = colony[curDay][x][y];
    for (int i = 0;i < 4;i ++)
    {
        xx = x + direction_x[i];
        yy = y + direction_y[i];
        if (xx < 0 || xx >= SIZE || yy < 0 || yy >= SIZE)
            continue;
        sum += colony[curDay][xx][yy];
    }
    return sum;
}

void propagate(int curDay)
{
    int nextDay = 1 - curDay;
    int sumOfAround;
    for (int i = 0;i < SIZE;i ++)
        for (int j = 0;j < SIZE;j ++)
        {
            sumOfAround = getSum(curDay, i, j);
            colony[nextDay][i][j] = colony[curDay][i][j] + DNA[sumOfAround];
            if (colony[nextDay][i][j] < 0)
                colony[nextDay][i][j] = 0;
            if (colony[nextDay][i][j] > 3)
                colony[nextDay][i][j] = 3;
        }
}

void printColony(int curDay)
{
    for (int i = 0;i < SIZE;i ++)
    {
        for (int j = 0;j < SIZE;j ++)
        {
            switch (colony[curDay][i][j])
            {
            case 0:
                printf(".");
                break;
            case 1:
                printf("!");
                break;
            case 2:
                printf("X");
                break;
            case 3:
                printf("#");
                break;
            }
        }
        printf("\n");
    }
}

int main ()
{
    int caseNum;
    scanf("%d",&caseNum);
    for (int i = 1;i <= caseNum;i ++)
    {
        int dayNum;
        scanf("%d",&dayNum);
        //读入DNA
        for (int k = 0;k < DNALEN;k ++)
                scanf("%d",&DNA[k]);
        //读入初始菌落情况
        for (int j = 0;j < SIZE;j ++)
            for (int k = 0;k < SIZE;k ++)
                scanf("%d",&colony[0][j][k]);
        
        int curDay = 0;
        //模拟dayNum天
        for (int j = 1;j <= dayNum;j ++)
        {
            propagate(curDay);
            curDay = 1 - curDay;
        }
        printColony(curDay);
        if (i < caseNum)
            printf("\n");
    }
    return 0;
}
posted @ 2012-08-22 22:06  peaceful  阅读(220)  评论(0)    收藏  举报