http://acm.pku.edu.cn/JudgeOnline/problem?id=1120

http://acm.pku.edu.cn/JudgeOnline/images/1120/1120_1.gif

Код:
#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;
}