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;
}