/
ylust
/
Study
Обзор
Документация
Войти
/
ylust
/
Study
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
EightQueens/Program.cs
161 строка
6 KB
User
Add XML documentation comments to the Eight Queens solution
22 май 2026, 23:14
22 май 2026, 23:14
af181ce
Код
Авторство
О чём код?
/// <summary> /// Программа для решения задачи о восьми ферзях. /// Задача заключается в расстановке восьми ферзей на шахматной доске 8×8 так, /// чтобы ни один ферзь не атаковал другого. /// </summary> using System; /// <summary> /// Основной класс программы для решения задачи о восьми ферзях. /// </summary> class Program { /// <summary> /// Размер шахматной доски (8×8) /// </summary> private const int N = 8; /// <summary> /// Массив для хранения позиций ферзей. Индекс - строка, значение - столбец. /// Например, board[0] = 2 означает, что ферзь находится в первой строке, третьем столбце. /// </summary> private static int[] board = new int[N]; /// <summary> /// Счетчик найденных решений /// </summary> private static int solutionCount = 0; /// <summary> /// Точка входа в программу /// </summary> static void Main() { Console.WriteLine("Задача о восьми ферзях\n"); Console.WriteLine("Нажмите любую клавишу для показа решений..."); // Попробуем прочитать клавишу, но если не получится, просто продолжим try { Console.ReadKey(); } catch (InvalidOperationException) { // Игнорируем ошибку, если не можем читать ввод с клавиатуры } Solve(0); Console.WriteLine("\nВсе решения найдены. Всего: " + solutionCount); Console.WriteLine("Нажмите любую клавишу для выхода..."); try { Console.ReadKey(); } catch (InvalidOperationException) { // Игнорируем ошибку } } /// <summary> /// Рекурсивный метод для поиска решений задачи о восьми ферзях /// </summary> /// <param name="row">Текущая строка, в которой размещается ферзь</param> static void Solve(int row) { // Если достигли последней строки, значит нашли решение if (row == N) { solutionCount++; PrintBoard(); Console.WriteLine("Решение #" + solutionCount); Console.WriteLine("Нажмите любую клавишу для следующего решения..."); try { Console.ReadKey(); } catch (InvalidOperationException) { // Если не можем читать ввод, ограничим количество решений if (solutionCount >= 10) { Console.WriteLine("Достигнуто максимальное количество решений для отображения."); Environment.Exit(0); } } 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> static 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> static void PrintBoard() { // Выводим доску 8x8 for (int i = 0; i < N; i++) { for (int j = 0; j < N; j++) { // Если в текущей строке i ферзь находится в столбце j, выводим "Q" // Иначе выводим "." Console.Write(board[i] == j ? "Q " : ". "); } Console.WriteLine(); } Console.WriteLine(); } }