/
ylust
/
Study
Обзор
Документация
Войти
/
ylust
/
Study
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
EightQueensGUI/QueenSolver.cs
170 строк
6 KB
User
Add GUI for Eight Queens problem with improved button layout
22 май 2026, 23:38
22 май 2026, 23:38
99d86a3
Код
Авторство
О чём код?
/// <summary> /// Класс для решения задачи о восьми ферзях /// </summary> public class QueenSolver { /// <summary> /// Размер шахматной доски (8×8) /// </summary> private const int N = 8; /// <summary> /// Массив для хранения позиций ферзей. Индекс - строка, значение - столбец. /// Например, board[0] = 2 означает, что ферзь находится в первой строке, третьем столбце. /// </summary> private int[] board = new int[N]; /// <summary> /// Список всех найденных решений /// </summary> private List<int[]> solutions = new List<int[]>(); /// <summary> /// Текущий индекс решения в списке решений /// </summary> private int currentSolutionIndex = 0; /// <summary> /// Возвращает текущий индекс решения /// </summary> /// <returns>Индекс текущего решения</returns> public int GetCurrentSolutionIndex() { return currentSolutionIndex; } /// <summary> /// Конструктор класса QueenSolver /// Инициализирует поиск всех решений задачи о восьми ферзях /// </summary> public QueenSolver() { Solve(0); } /// <summary> /// Рекурсивный метод для поиска решений задачи о восьми ферзях /// </summary> /// <param name="row">Текущая строка, в которой размещается ферзь</param> private void Solve(int row) { // Если достигли последней строки, значит нашли решение if (row == N) { // Добавляем копию текущего решения в список решений solutions.Add((int[])board.Clone()); return; } // Пробуем разместить ферзя в каждом столбце текущей строки for (int col = 0; col < N; col++) { // Проверяем, безопасно ли размещать ферзя в текущей позиции if (IsSafe(row, col)) { // Размещаем ферзя board[row] = col; // Рекурсивно ищем решение для следующей строки Solve(row + 1); } } } /// <summary> /// Проверяет, безопасно ли размещать ферзя в указанной позиции /// </summary> /// <param name="row">Строка, в которую будет размещен ферзь</param> /// <param name="col">Столбец, в который будет размещен ферзь</param> /// <returns>True, если позиция безопасна, иначе False</returns> private bool IsSafe(int row, int col) { // Проверяем все ранее размещенные ферзи for (int i = 0; i < row; i++) { int queenCol = board[i]; // Проверяем, находится ли новый ферзь в том же столбце if (queenCol == col) { return false; } // Проверяем, находится ли новый ферзь на одной диагонали по направлению влево-вверх if (queenCol - i == col - row) { return false; } // Проверяем, находится ли новый ферзь на одной диагонали по направлению вправо-вверх if (queenCol + i == col + row) { return false; } } // Если все проверки пройдены, позиция безопасна return true; } /// <summary> /// Возвращает количество найденных решений /// </summary> /// <returns>Количество решений</returns> public int GetSolutionsCount() { return solutions.Count; } /// <summary> /// Возвращает текущее решение /// </summary> /// <returns>Массив позиций ферзей для текущего решения</returns> public int[] GetCurrentSolution() { if (solutions.Count == 0) return null; return solutions[currentSolutionIndex]; } /// <summary> /// Переходит к следующему решению /// </summary> /// <returns>True, если удалось перейти к следующему решению, иначе False</returns> public bool NextSolution() { if (solutions.Count == 0) return false; currentSolutionIndex = (currentSolutionIndex + 1) % solutions.Count; return true; } /// <summary> /// Переходит к предыдущему решению /// </summary> /// <returns>True, если удалось перейти к предыдущему решению, иначе False</returns> public bool PreviousSolution() { if (solutions.Count == 0) return false; currentSolutionIndex = (currentSolutionIndex - 1 + solutions.Count) % solutions.Count; return true; } /// <summary> /// Устанавливает текущее решение по индексу /// </summary> /// <param name="index">Индекс решения</param> /// <returns>True, если индекс валиден и решение установлено, иначе False</returns> public bool SetSolution(int index) { if (index >= 0 && index < solutions.Count) { currentSolutionIndex = index; return true; } return false; } }