Одна вещь, которую я сделал во время своей разработки, - это первое, что я разработал на пути программирования. Следующие слова рассказывают о том, как я это сделал, чему я научился и чему это помогло.
Однажды днем мой профессор преподавал задачу 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. Мне было что сказать на собеседовании в кампусе.
Программирование - это думать, а не печатать.
Ссылки: