示例#1
0
 //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);                                                  //Начнем перебор решений
         }
     }
 }
示例#2
0
        /// <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);
        }