http://acm.pku.edu.cn/JudgeOnline/problem?id=1120
Код:
#include <iostream> using namespace std; const int dishSize = 20; const char representation[] = {'.', '!', 'X', '#'}; int rule[16]; int *dish1, *dish2; int index(int i, int j) { return i*dishSize + j; } // // Return the value of the [i,j] cell, returning 0 if // [i,j] is outside the dish. // int cellValue(int* dish, int i, int j){ if (i < 0 || i >= dishSize || j < 0 || j >= dishSize) return 0; else return dish[index(i,j)]; } int cellSum(int* dish, int i, int j) { return cellValue(dish, i, j) + cellValue(dish, i-1, j) + cellValue(dish, i+1, j) + cellValue(dish, i, j-1) + cellValue(dish, i, j+1); } void printDish(int* dish) { for (int i = 0; i < dishSize; ++i) { for (int j = 0; j < dishSize; ++j) { int k = dish[index(i,j)]; cout << representation[k]; } cout << endl; } } int main() { int nGen; cin >> nGen; for (int i = 0; i < 16; i++) cin >> rule[i]; dish1 = new int[dishSize*dishSize]; dish2 = new int[dishSize*dishSize]; for (int i = 0; i < dishSize; ++i) { for (int j = 0; j < dishSize; ++j) { cin >> dish1[index(i,j)]; } } for (int gen = 0; gen < nGen; ++gen) { #ifdef DEBUG printDish (dish1); cout << "\n\nGeneration " << gen+1 << endl; #endif copy (dish1, dish1+dishSize*dishSize, dish2); for (int i = 0; i < dishSize; ++i) { for (int j = 0; j < dishSize; ++j) { int k = dish1[index(i,j)] + rule[cellSum(dish2, i, j)]; if (k < 0) k = 0; if (k > 3) k = 3; dish1[index(i,j)] = k; } } } printDish(dish1); return 0; }