//3. ***Требуется обойти конём шахматную доску размером NxM, пройдя через все поля доски по одному разу. Здесь алгоритм решения //такой же как и в задаче о 8 ферзях.Разница только в проверке положения коня. static void Task3(int N, int M) // { int[,] ChessField = new int[N, M]; //Объявляем и инициализируем шахматную доску N, M PrintChessField(ChessField, N, M); //Выведем шахматную доску в консоли for (int i = 0; i < N; i++) //Переберем строки { //Console.Beep(500, 300); for (int j = 0; j < M; j++) //Переберем столбцы { ChessField firstField = new ChessField(ChessField, i, j, 1); //Найдем решения для всех полей шахматной доски HorseStep(firstField); //Начнем перебор решений } } }
/// <summary> /// Метод, который принимает поле и перебирает возможные будущие шаги /// </summary> /// <param name="_chessFld">объект ChessField с координатами коня на поле и состоянием поля на данный момент</param> /// <returns></returns> static bool HorseStep(ChessField _chessFld) { if (_chessFld.Counter == ChessField.MaxRow * ChessField.MaxColumn) //Если после хода коня его счетчик равен количеству полей шахматной доски, то мы нашли решение { Console.WriteLine("Решение выглядит следующим образом!!!\n"); PrintChessField(_chessFld.field, ChessField.MaxRow, ChessField.MaxColumn); //Выводим данное решение в консоль return(true); } List <ChessField> FieldList = new List <ChessField>(); //Список, который будет в себе хранить все ходы коня начиная с позиции _chessFld //Из центра поля конь может ходить на 8 возможных позиций //Здесь производится проверка возможности хода всех восьми полей на шахматной доске //Объявление и добавление в список ходов, которые затем будут перебраны в цикле ChessField F1 = new ChessField(_chessFld.field, _chessFld.row - 1, _chessFld.column + 2, _chessFld.Counter + 1); FieldList.Add(F1); ChessField F2 = new ChessField(_chessFld.field, _chessFld.row + 1, _chessFld.column + 2, _chessFld.Counter + 1); FieldList.Add(F2); ChessField F3 = new ChessField(_chessFld.field, _chessFld.row + 2, _chessFld.column + 1, _chessFld.Counter + 1); FieldList.Add(F3); ChessField F4 = new ChessField(_chessFld.field, _chessFld.row + 2, _chessFld.column - 1, _chessFld.Counter + 1); FieldList.Add(F4); ChessField F5 = new ChessField(_chessFld.field, _chessFld.row + 1, _chessFld.column - 2, _chessFld.Counter + 1); FieldList.Add(F5); ChessField F6 = new ChessField(_chessFld.field, _chessFld.row - 1, _chessFld.column - 2, _chessFld.Counter + 1); FieldList.Add(F6); ChessField F7 = new ChessField(_chessFld.field, _chessFld.row - 2, _chessFld.column - 1, _chessFld.Counter + 1); FieldList.Add(F7); ChessField F8 = new ChessField(_chessFld.field, _chessFld.row - 2, _chessFld.column + 1, _chessFld.Counter + 1); FieldList.Add(F8); foreach (var fld in FieldList) //Перебираем все ходы коня, в которые можно ходить { if (fld.IsEnabled) //если данный ход допустим, то делаем ход по данной ячейке { HorseStep(fld); } } return(false); }