Главная » Статьи » Программирование » С++ |
Наверное, очень долго придется думать перед тем как намериться решить задачу о «ходе коня». Над этой задачей бьются многие. В свое время бились математики над ее решением. А сутью самой задачи является задание отыскать такое решение, чтобы конь прошел по шахматной доске 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. | |
Просмотров: 4154 | Комментарии: 3 | | |
Всего комментариев: 1 | |
| |