Главная » Статьи » Программирование » С++

К задаче о ходе конем по шахматной доске

Наверное, очень долго придется думать перед тем как намериться решить задачу о «ходе коня». Над этой задачей бьются многие. В свое время бились математики над ее решением. А сутью самой задачи является задание отыскать такое решение, чтобы конь прошел по шахматной доске N×M размерности побывав лишь по одному разу в каждой из ячеек доски. Математических решений этой задачи существует уже несколько: это метод Эйлера и метод Вандерморта, правило Варнсдорфа, маршрут Яниша и многие другие. Если кому интересно почитать о предыстории вопроса хорошо написано в Википедии.

Однако не все задачи сводятся к поиску такого пути. На сегодняшний день существует и несколько методов программного решения этой задачи: итеративные, рекурсивные. По поводу этих методов пишутся курсовые, дипломные, докторские работы. Наша же задача немножко в другом. Нам надо отыскать для доски 6х6 возможность хода коня по полю, но при этом координаты задает пользователь на каждом из шагов. Таким образом, пользователь видит каждый свой ход и делает следующий с оглядкой на предыдущие, пытаясь найти оптимальный ход. Скажем еще, что пользователь ограничен в количестве ходов. Для доски 6х6 их не может быть более 36. Для доски другого размера таких ходов не может быть более NхN. Кроме того, в решении применим рекурсивную функцию. Рекурсивная функция – это функция вызывающая саму себя. Для таких функций важно, чтобы существовало некое условие, которое ограничит ее выполнение, чтобы рекурсивная функция не вызывала саму себя до бесконечности. Рекурсия – понятие довольно сложное и требует отдельной статьи, о чем поговорим в будущем. А сейчас запишем основные элементы для нашей работы:

Это оформление подключения к библиотеке <iostream> и к пространству имен, где содержится cout<< и cin>>. Кроме того, запишем интересующий нас прототип функции для нашего коня, далее основную функцию int main(){ return 0;} и собственно нашу создаваемую функцию, которая будет вызывать себя не более 36 раз, чтобы пользователь смог ввести свои значения координат. В виде коня будут использоваться числа, отражающие номер совершенного хода. Поле доски будет представлять собой двумерный массив, который будет входить в сигнатуру нашей функции и будет состоять из нулей. Нули будут заменяться цифрами по каждому из ходов.

Итак верхняя часть нашей «игрушки» примет следующий вид:

#include<iostream>

usingnamespace std;

int horse(int mass[][6],int size,int x,int y,int move);

 

Где последнее выражение представляется  нам прототипом искомой функции обрабатывающей  ходы пользователя. В сигнатуре прототипа – имя целочисленной функции, целочисленный двумерный массив, размер массива size, координаты, которые будут задаваться пользователем и счетчик ходов.

Основная часть выглядит так:

 

int main()

       constint sizes=6;

       int mas[sizes][6]={};

       int a,b;

       int moving=1;

    cout<<"Enter your coordinates your first step A is x and B is Y->"<<endl;

       cout<<"A=";

       cin>>a;

       cout<<endl;

       cout<<"B=";

       cin>>b;

       cout<<endl;

       horse(mas,sizes,a,b,moving);

  

 

return 0;

}

В ней мы инициализируем константное значение size, объявляем массив, а также переменные aи b, которым суждено стать нашими координатами, а также переменную moving, которую инициализируем со значением 1, так как начинать будем с первого, а не с нулевого хода. Далее запрашиваем у нашего пользователя первые координаты, а далее происходит вызов функции horse.

 

Эта функция, собственно выглядит так:

int horse(int mass[][6],int size,int x,int y,int move)

{  

      

       mass[x][y]=move;

 

       cout<<"  ";

       for(int i=0;i<6;i++)

             cout<<i<<' ';

       cout<<endl;

       for(int i=0;i<size;i++)

      

                    {   cout<<i<<' ';

                           for(int j=0;j<6;j++)

          { 

               cout<<mass[i][j]<<' ';

                            

}

       cout<<endl; 

       }

           if(move>36) return 1;

       else

             {

                   

       cout<<"Enter your coordinates your first step A is x and B is Y->"<<endl;

       cout<<"A=";

       cin>>x;

       cout<<endl;

       cout<<"B=";

       cin>>y;

       cout<<endl;

             horse(mass,size,x,y,move+1);

       }

      

    return 0;

}

В самой функции присваиваем значение moveэлементу массива с координатами x,y. Далее, происходит заполнение массива нулевыми значениями. После чего мы прибегаем к применении рекурсии, установив первоначально условие, что вызовов функции будет не более 36 раз. Если таки вызовов меньше 36, согласно счетчику move, то мы запрашиваем у пользователя очередной ход и вызываем функцию horse.

Категория: С++ | Добавил: lesha (14.03.2015)
Просмотров: 4081 | Комментарии: 3 | Теги: с++, задача о ходе конем | Рейтинг: 5.0/1
Всего комментариев: 1
1 andre55561  
Можно ли с Вами пообщаться по задаче Эйлера о ходе коня? С уважением, Андрей.

Имя *:
Email *:
Код *: