Матч 334, Путь коня (KnightTour)

Дивизион 2, Уровень 2

 

Допустимым путем шахматного коня на доске 6*6 назовем такую последовательность ходов, при которой посещаются все поля доски, а из последней клетки пути конь может попасть в первую (путь является замкнутым). Например, один из возможных таких путей, начинающийся в “A1” и заканчивающийся в “C2”, изображен на рисунке:

Путь коня задается в массиве cells, каждый элемент которого является строкой вида “<буква><цифра>”. Каждая такая строка описывает координату хода коня на доске. По заданному пути необходимо определить,  является ли он допустимым.

 

Класс: KnightTour

Метод: string checkTour(vector<string> cells)

Ограничения: cells содержит в точности 36 строк в формате “<буква><цифра>”, где ‘A’ £ <буква> £ ‘F’, 1 £ <цифра> £ 6.

 

Вход. Массив строк cells, описывающий путь коня.

 

Выход. Если путь допустимый, то вернуть “Valid”, иначе “Invalid”.

 

Пример входа

cells

{"A1", "B3", "A5", "C6", "E5", "F3",
"D2", "F1", "E3", "F5", "D4", "B5",
"A3", "B1", "C3", "A2", "C1", "E2",
"F4", "E6", "C5", "A6", "B4", "D5",
"F6", "E4", "D6", "C4", "B6", "A4",

"B2", "D1", "F2", "D3", "E1", "C2"}

{"A1", "C2", "E3", "F5", "D4", "B3",
"A1", "C2", "E3", "F5", "D4", "B3",
"A1", "C2", "E3", "F5", "D4", "B3",
"A1", "C2", "E3", "F5", "D4", "B3",
"A1", "C2", "E3", "F5", "D4", "B3",

"A1", "C2", "E3", "F5", "D4", "B3"}

{"D4", "F5", "D6", "B5", "A3", "B1",
"D2", "F1", "E3", "D1", "F2", "E4",
"F6", "D5", "B6", "A4", "B2", "C4",
"A5", "C6", "E5", "F3", "E1", "C2",
"A1", "B3", "C5", "E6", "F4", "E2",

"C3", "A2", "C1", "D3", "B4", "A6"}

 

Пример выхода

“Valid”

“Invalid”

“Invalid”

 

 

РЕШЕНИЕ

моделирование

 

Заведем массив vis[6][6], в котором будем отмечать ходы коня: vis[i][j] = 1, если в клетке (i, j) уже побывал конь и vis[i][j] = 0 иначе. На вход функции cango подаются координаты двух клеток a и b. Она возвращает истину, если  конь может пройти из клетки a в клетку b. Последнее возможно, если клетка b еще не была пройдена, а клетки a и b находятся друг от друга на расстоянии одного хода коня.

Имея массив cells, моделируем движение коня. Если какой-нибудь ход невозможен, устанавливаем переменную flag в 1 и выходим из цикла. В зависимости от значения переменной flag возвращаем результат.

 

ПРОГРАММА

 

#include <cstdio>

#include <vector>

#include <string>

#include <cmath>

using namespace std;

 

int vis[6][6];

 

int cango(string a, string b)

{

  int v1 = a[0] - 'A';

  int h1 = a[1] - '0';

  int v2 = b[0] - 'A';

  int h2 = b[1] - '0';

  if (vis[v1][h1]) return 0;

  vis[v1][h1] = 1;

  int dx = abs(v1 - v2);

  int dy = abs(h1 - h2);

  return (((dx == 1) && (dy == 2)) || ((dx == 2) || (dy == 1)));

}

 

class KnightTour

{

public:

  string checkTour(vector<string> cells)

  {

    int i, flag;

    memset(vis,0,sizeof(vis));

    cells.push_back(cells[0]);

    for(flag = i = 0; i < cells.size() - 1; i++)   

      if(!cango(cells[i],cells[i+1])) {flag = 1; break;}

    return (flag) ? "Invalid" : "Valid";

  }

};