HDOJ 1057 模拟 水
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1057
这题首先考查理解题意,我把要点总结一下。
- 有20*20的菌落(即总共有400个格子的菌落),每个小格内菌落的数量用0~3四个等级描述。
- 假设K为某个菌落,及其上下左右四个菌落的数量之和。每过一天,每个格子内的菌落的数量的变化等于DNA[K]。
- 每个格子内的菌落的数量永远在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; }

浙公网安备 33010602011771号