Одна вещь, которую я сделал во время своей разработки, - это первое, что я разработал на пути программирования. Следующие слова рассказывают о том, как я это сделал, чему я научился и чему это помогло.

Однажды днем ​​мой профессор преподавал задачу n-ферзей с n = 8 на примере алгоритма Отслеживание с возвратом. Это было полностью теоретическое объяснение. Но я подумал о том, как этого можно достичь практически, а также о том, как это можно сделать универсальным? Общий в том смысле, что его можно расширить до n, поскольку само название говорит о том, что это игра, в которую играют n ферзей.

Итак, изначально я сформулировал алгоритм следующим образом.
1. Получите число (n) от пользователя и отобразите шахматную доску (n * n) соответственно.
2. Для каждого ферзя пользователь собирается place, вычислите все его конфликтующие места и сохраните его.
3. В конце, используя сохраненные данные, найдите конфликтующих ферзей, покажите результат пользователю.

Ниже представлена ​​реализация:

Шаг 1 - Получение одного числа от пользователя и отображение шахматной доски.

Шаг 2 - Для каждой позиции ферзя требовалось найти все места ее столкновения, ребро и следующие числа во всех 8 направлениях.

Проблема здесь в положении ферзя, т.е. угол (верхний правый, верхний левый, нижний правый, нижний левый), край (верхний, нижний, левый, правый) или посередине. В зависимости от позиции будет одна формула для определения края и следующих чисел.

Вверху слева:

Next no = (queen_position - 1) * i - board_size
Edge:
    if ((next_num % board_size) == 1 )
      return true;
    else if (((next_num - 1) / board_size) == 0) 
      return true;
    else
      return false;

Вверху справа:

Next no = (queen_position + 1) * i - board_size
Edge:
    if ((next_num % board_size) == 0)
      return true;
    else if (((next_num - 1) / board_size) == 0)
      return true;
    else
      return false;

Внизу слева:

Next no = (queen_position - 1) * i + board_size
Edge:
    if ((next_num % board_size) == 1)
       return true;
    else if (((next_num - 1) / board_size) == (board_size - 1))
       return true;
    else
       return false;

Внизу справа:

Next no = (queen_position + 1) * i + board_size
Edge:
    if ((next_num % board_size) == 0)
     return true;
    else if (((next_num - 1) / board_size) == (board_size - 1))
     return true;
    else
     return false;

Сверху:

Next no = queen_position - (board_size * i)
Edge:
    if((next_num — 1) / board_size == 0)
      return true;
    else
      return false

Внизу:

Next No = queen_position + (board_size * i)
Edge:
    if(((next_num — 1) / board_size) == (board_size - 1))
      return true;
    else
      return false;

Слева:

Next no = queen_position - 1 * i
Edge:
    if(next_num % board_size == 1)
      return true;
    else
      return false;

Справа:

Next no = queen_position +1 * i
Edge:
    if(next_num % board_size == 0)
      return true;
    else
      return false;

Будет 8 массивов. Для каждого ферзя будут применяться приведенные выше формулы, а результат будет помещен в соответствующий массив.

Из этих массивов будет рассчитан индекс повторения.

Для каждой позиции на доске max repitation-index будет
- 0 для позиций, где были размещены ферзи.
- 4 для позиций, кроме размещенных ферзей. Потому что позиция на плате может быть неклассируемой только тогда, когда она присутствует, максимум 4 раза во всех восьми массивах.

На основе этого индекса повторения окончательный результат будет рассчитан следующим образом:

Если индексы повторения, соответствующие всем местам ферзя, равны 0, то пользователь выиграл игру. В противном случае пользователь проиграет игру и отобразит разницу в цвете, чтобы показать пользователю класс Queen’s с помощью индекса повторения.

Что я узнал:

  1. Как подойти к проблеме.
  2. Как писать модульный код.
  3. Важность качества кода.
  4. Как писать масштабируемый и повторно используемый код.

Преимущества:
1. Это было первое, что я разработал в программировании, это придало мне больше уверенности. С этим я очень хорошо выполнил свой последний годовой проект.

2. Мне было что сказать на собеседовании в кампусе.

Программирование - это думать, а не печатать.

Ссылки:

Исходный код - Ссылка на игру