Решение задачи A квалификационного раунда Google CodeJam 2013


Исходный текст задания на англ. языке: Problem A. Tic-Tac-Toe-Tomek

Задача

Для игры «Tic-Tac-Toe-Tomek» используется доска размером 4 x 4 клетки.  Первоначально лишь одна из 16 клеток занята символом ‘T’.  Участвуют два игрока: X и O.  Они ходят по очереди, начинает игрок X. Во время каждого хода игрок ставит свой символ в одну клетку.  Игрок X использует символ ‘X’, игрок O – символ ‘O’.

Если после хода игрока строка, столбец или диагональ содержит 4 его символа или 3  его символа и символ ‘T’, он признается победителем игры. Если все клетки заполнены символами, но победителя нет, игра заканчивается вничью. Варианты позиций приведены в примере входных данных.

По описанию позиции, заданному символами ‘X’, ‘O’, ‘T’ и ‘.’ (‘.’ обозначает пустую клетку), определите состояние игры «Tic-Tac-Toe-Tomek». Возможные состояния:

  • «X won» (игра окончена, победитель – X)
  • «O won» (игра окончена, победитель – O)
  • «Draw» (игра закончилась вничью)
  • «Game has not completed» (игра ещё не окончена)

Если есть пустые клетки, и игра ещё не закончена, выводите строку «Game has not completed» даже при очевидном исходе игры.

Входные данные

Первая строка содержит количество наборов данных, T. Далее находятся T наборов данных. Каждый набор состоит из 4 строк по 4 символа: ‘X’, ‘O’, ‘.’ или ‘T’ (кавычки приводятся только для выделения символов). За каждым набором данных следует пустая строка.

Выходные данные

Для каждого набора данных выводите одну строку вида «Case #x: y», где x – это номер набора данных (начиная с 1), y – состояние игры. При работе с примером входных данных ваша программа должна вывести точную копию примера выходных данных, включая «Case #1: «, заглавную букву «O», а не цифру «0», и т.п.

Ограничения

Входные данные представляют собой корректные состояния игры «Tic-Tac-Toe-Tomek» по вышеприведнным правилам.

Пример

Входные данные

6
XXXT
....
OO..
....

XOXT
XXOO
OXOX
XXOO

XOX.
OX..
....
....

OOXX
OXXX
OX.T
O..O

XXXO
..O.
.O..
T...

OXXX
XO..
..O.
...O

 

Выходные данные

Case #1: X won
Case #2: Draw
Case #3: Game has not completed
Case #4: O won
Case #5: O won
Case #6: O won

Решение на C#

using System;

class TicTac
{
  const Byte size = 4;
    const char X = 'X';
    const char O = 'O';
    const char T = 'T';
    const char dot = '.';

  static void Main(string[] args)
  {
    int dotCount;
    UInt16 i;
    string result;
    bool winnerFound;
    int caseNum;

    UInt16 gameCount = UInt16.Parse(Console.ReadLine());

    for (i = 0; i < gameCount; i++)
    {
      var game = ReadGame();
      winnerFound = false;
      dotCount = 0;
      caseNum = i + 1;

      //проверка строк
      for (Byte row = 0; row < size; row++)
      {
        winnerFound = CheckCells(game[row].ToCharArray(), ref dotCount, caseNum);
        if(winnerFound) break;
      }
      if (winnerFound)
        continue;

      //проверка столбцов
      for (int col = 0; col < size; col++)
      {
        var column = new char[size];
        for (int row = 0; row < size; row++)
         {
           column[row] = game[row][col];
         }
         winnerFound = CheckCells(column, ref dotCount, caseNum);
         if (winnerFound)
           break;
       }
       if (winnerFound)
         continue;
       //проверка диагоналей
       var diag1 = new char[size] { game[0][0], game[1][1], game[2][2], game[3][3]};
       if (CheckCells(diag1, ref dotCount, caseNum))
         continue;
       var diag2 = new char[size] { game[0][3], game[1][2], game[2][1], game[3][0] };
       if (CheckCells(diag2, ref dotCount, caseNum))
         continue;
       if (dotCount > 0)
        result = "Game has not completed";
      else
        result = "Draw";
      Console.WriteLine("Case #{0}: {1}", caseNum, result);
    }
  }

  static string[] ReadGame()
  {
    var game = new string[size];
    for (Byte row = 0; row < size; row++)
    {
      game[row] = Console.ReadLine();
    }
    Console.ReadLine();
    return game;
  }

  static bool CheckCells(char[] cells, ref int dots, int gameNum)
  {
    Byte x = 0;
    Byte o = 0;
    bool t = false;
    char cell;
    for(int i=0; i < size; i++)
    {
      cell = cells[i];
      if(cell == X) x++;
      if(cell == O) o++;
      if(cell == T)  t = true;
      if (cell == dot) dots++;
    }
    if(t)
    {
      x++;
      o++;
    }
    if (x == size)
    {
      Console.WriteLine("Case #{0}: X won", gameNum);
      return true;
    }
    if (o == size)
    {
      Console.WriteLine("Case #{0}: O won", gameNum);
      return true;
    }
    return false;
  }
}
Реклама
Запись опубликована в рубрике перевод, программирование с метками , . Добавьте в закладки постоянную ссылку.

Добавить комментарий

Заполните поля или щелкните по значку, чтобы оставить свой комментарий:

Логотип WordPress.com

Для комментария используется ваша учётная запись WordPress.com. Выход / Изменить )

Фотография Twitter

Для комментария используется ваша учётная запись Twitter. Выход / Изменить )

Фотография Facebook

Для комментария используется ваша учётная запись Facebook. Выход / Изменить )

Google+ photo

Для комментария используется ваша учётная запись Google+. Выход / Изменить )

Connecting to %s