Задача про хід коня — задача про знаходження маршруту шахового коня, що проходить через усі поля шахівниці по одному разу.
Ця задача відома принаймні з XVIII століття. Леонард Ейлер присвятив їй велику роботу «Вирішення одного цікавого питання, яке, здається, не підпорядковується жодному дослідженню» (датується 26 квітня 1757 року). У листі до Гольдбаха він повідомляв:«… Спогад про запропоноване колись мені завдання послужив для мене нещодавно приводом до деяких тонких вишукувань, до яких звичайний аналіз, як здається, не має ніякого застосування … Я знайшов, нарешті, ясний спосіб знаходити скільки завгодно рішень (число їх, однак, не нескінченне), не роблячи проб.» Окрім розгляду завдання для коня, Ейлер розібрав аналогічні завдання і для інших фігур.
У термінах теорії графів кожен маршрут коня, що проходить через всі поля шахівниці, відповідає гамільтоновому шляху (або циклу, якщо маршрут замкнений) у графі ходів коня — графі, вершинами якого є поля дошки, і два поля з'єднані ребром, якщо з одного можна потрапити на інше за один хід коня.
Кількість всіх замкнутих маршрутів коня (гамільтонових циклів) без урахування напрямку обходу дорівнює 13 267 364 410 532 (кількість замкнутих маршрутів з урахуванням напрямку в два рази більше). У той же час завдання підрахунку всіх можливих незамкнутих маршрутів значно складніше і не вирішене досі. Відомо, що кількість незамкнутих маршрутів не перевищує числа сполучень .
Методи вирішення
Метод Ейлера і Вандермонда
Метод Ейлера
Метод Ейлера полягає в тому, що спочатку кінь рухається за довільним маршрутом, поки не вичерпає всі можливі ходи. Потім непройдені клітинки, що залишилися, додаються в зроблений маршрут (після спеціальної перестановки його елементів).
Розглянемо як приклад наступний маршрут:
55 | 58 | 29 | 40 | 27 | 44 | 19 | 22 |
60 | 39 | 56 | 43 | 30 | 21 | 26 | 45 |
57 | 54 | 59 | 28 | 41 | 18 | 23 | 20 |
38 | 51 | 42 | 31 | 8 | 25 | 46 | 17 |
53 | 32 | 37 | a | 47 | 16 | 9 | 24 |
50 | 3 | 52 | 33 | 36 | 7 | 12 | 15 |
1 | 34 | 5 | 48 | b | 14 | c | 10 |
4 | 49 | 2 | 35 | 6 | 11 | d | 13 |
Спочатку спробуємо з незамкненого маршруту зробити замкнений. Для цього розглянемо, куди можна піти з полів 1 та 60. З поля 1 можна піти на поля 2, 32 і 52, а з 60 — на 29, 51 і 59. У ціх двох наборах є поля, що розрізняються на одиницю, а саме — 51 і 52. Завдяки цьому можна зробити маршрут замкнутим, звернувши його частини. Для цього пронумеруємо поля з 52 по 60 в зворотньому порядку. Після цього ми отримаємо замкнений маршрут:
57 | 54 | 29 | 40 | 27 | 44 | 19 | 22 |
52 | 39 | 56 | 43 | 30 | 21 | 26 | 45 |
55 | 58 | 53 | 28 | 41 | 18 | 23 | 20 |
38 | 51 | 42 | 31 | 8 | 25 | 46 | 17 |
59 | 32 | 37 | a | 47 | 16 | 9 | 24 |
50 | 3 | 60 | 33 | 36 | 7 | 12 | 15 |
1 | 34 | 5 | 48 | b | 14 | c | 10 |
4 | 49 | 2 | 35 | 6 | 11 | d | 13 |
Тепер можна додати в маршрут деякі з непройдених клітинок. Оскільки наш маршрут замкнений, то його можна розірвати в довільному місці і до одного з кінців причепити відповідний ланцюжок з непройдених клітинок. Наприклад, якщо розірвати ланцюжок у клітинці 51 (перенумерувати клітинки і зробивши її останньою, а 52 — першою), то зможемо подовжити наш ланцюжок на клітинки a, b і d, які стануть клітинками 61, 62 і 63.
Метод Вандермонда
Александр Вандермонд спробував звести задачу до арифметичної. Для цього він позначав маршрут коня по дошці у вигляді послідовності дробів , де x і y — координати поля на дошці. Очевидно, що в послідовності дробів, що відповідає ходам коня, різниця чисельників двох сусідніх дробів може бути тільки 1 або 2, притому, що різниця їх знаменників становить відповідно 2 або 1. Крім того, чисельник і знаменник не можуть бути менше 1 і більше 8.
Його метод знаходження відповідної послідовності аналогічний методу Ейлера, але дозволяє знаходити маршрути коня тільки для дошки парної розмірності.
Рамковий метод Мунка і Коллін
Метод поділу на чверті Поліньяка і Роже
Правило Варнсдорфа
Правило Варнсдорфа, що є різновидом жадібного алгоритму для відшукання маршруту коня, формулюється так:
- При обході дошки кінь повинен ставати на те поле, з якого можна піти на мінімальне число ще не пройдених полів. Якщо таких полів кілька, то можна піти на будь-яке з них.
Цікаві маршрути
Маршрут Яниша
50 | 11 | 24 | 63 | 14 | 37 | 26 | 35 |
23 | 62 | 51 | 12 | 25 | 34 | 15 | 38 |
10 | 49 | 64 | 21 | 40 | 13 | 36 | 27 |
61 | 22 | 9 | 52 | 33 | 28 | 39 | 16 |
48 | 7 | 60 | 1 | 20 | 41 | 54 | 29 |
59 | 4 | 45 | 8 | 53 | 32 | 17 | 42 |
6 | 47 | 2 | 57 | 44 | 19 | 30 | 55 |
3 | 58 | 5 | 46 | 31 | 56 | 43 | 18 |
Цей маршрут цікавий у багатьох відношеннях: він утворює напівмагічний квадрат, а при повороті дошки на 180° перша половина маршруту (номери з 1 до 32) переходить у другу (номери з 33 по 64).
Узагальнення на довільні дошки
Замкнуті маршрути
Кількість замкнутих маршрутів з урахуванням напрямку в два рази більша. Замкнені маршрути існують на дошках для всіх парних (послідовність A001230 з Онлайн енциклопедії послідовностей цілих чисел, OEIS).
Незамкнуті маршрути
Для неквадратних дощок незамкнений обхід конем існує тільки при виконанні таких умов: якщо одна сторона дошки дорівнює 3, то інша повинна бути або 4, або не менше 7; якщо ж обидві сторони більші 3, то обхід конем можливий на всіх дошках, крім 4 × 4. Зокрема, незамкнуті маршрути існують на квадратних дошках для всіх . Кількість незамкнутих маршрутів на дошках утворює послідовність A165134 з Онлайн енциклопедії послідовностей цілих чисел, OEIS.
Реалізація задачі про хід коня мовою програмування С++
Нижче наведено програмну реалізацію мовою програмування С++.
#include "stdafx.h" #include <stdlib.h> #include <stdio.h> #include <iostream> #include <time.h> using namespace std; #define move_types 8 int possible_moves[move_types][2] = { {-1, -2}, {-2, -1}, {-2, 1}, { 1, -2}, {-1, 2}, { 2, -1}, { 1, 2}, { 2, 1} }; int **global; int size_x, size_y; int max_moves, back_ret; int move_possible(int x, int y) { return x >= 0 && y >= 0 && x < size_x && y < size_y && global[x][y] == 0; } int find_path(int cur_x, int cur_y, int move_num) { int next_x = 0, next_y = 0; global[cur_x][cur_y] = move_num; if(move_num > max_moves) return 1; for(int i = 0; i < move_types; i++) { next_x = cur_x + possible_moves[i][0]; next_y = cur_y + possible_moves[i][1]; if(move_possible(next_x, next_y) && find_path(next_x, next_y, move_num + 1)) return 1; } global[cur_x][cur_y] = 0; back_ret++; move_num++; return 0; } void main() { setlocale (LC_ALL,""); int i,nrows,ncols,sy,sx,**desc = NULL; time_t start,end; cout<<"Введіть розмір дошки (від 2 до 8) :"<<endl <<"по осі \"X\"\t"; cin>>size_x; cout<<"по осі \"Y\"\t";cin>>size_y; if(size_x>8||size_x<2||size_y>8||size_y<2) {cout<<"Неправильний розмір";system("pause");return;} cout<<"Введіть початкові координати:"<<endl <<"Координата по осі\"X\"\t";cin>>sx; cout<<"Координата по осі\"Y\"\t";cin>>sy; desc = (int **)malloc(sizeof(int) * size_x); for(i = 0; i < size_x; ++i) desc[i] = (int *)malloc(sizeof(int) * size_y); back_ret = 0; global = desc; max_moves = size_x * size_y - 1; for(int i = 0; i < size_x; ++i) { for(int j = 0; j < size_y; ++j) global[i][j] = 0; } if(find_path(sx, sy, 1)){ cout<<"___________________________________________"<<endl <<"\t*********Розв\'язок*********"<<endl <<"___________________________________________"<<endl; for(int i = 0; i < size_x; ++i) { cout<<endl; for(int j = 0; j < size_y; ++j) cout<<global[i][j]<<"\t"; cout<<endl;} cout<<"___________________________________________"<<endl; } else cout<<"Немає розв\'язку"<<endl; for(i = 0; i < size_x; ++i) free(desc[i]); free(desc); system("pause"); }
Див. також
Примітки
- Brendan McKay (1997). . Technical Report TR-CS-97 -03. Department of Computer Science, Australian National University. Архів оригіналу за 27 січня 2012. Процитовано 31 грудня 2010.
- Е. Гік. Глава 2. Кінь-хамелеон // Шахи і математика. — М. : Наука. — (Бібліотечка «Квант») з джерела 26 липня 2020
- A. Conrad, T. Hindrichs, H. Morsy, I. Wegener (1994). Solution of the Knight's Hamiltonian Path Problem on Chessboards. Discr. Appl. Math. 50: 125—134. doi:10.1016/0166-218X(92)00170-Q.
Посилання
- Rediscovery of the Knight's Tour 1725—1825 [ 5 травня 2009 у Wayback Machine.] (англ.)
Це незавершена стаття з математики. Ви можете проєкту, виправивши або дописавши її. |
Вікіпедія, Українська, Україна, книга, книги, бібліотека, стаття, читати, завантажити, безкоштовно, безкоштовно завантажити, mp3, відео, mp4, 3gp, jpg, jpeg, gif, png, малюнок, музика, пісня, фільм, книга, гра, ігри, мобільний, телефон, android, ios, apple, мобільний телефон, samsung, iphone, xiomi, xiaomi, redmi, honor, oppo, nokia, sonya, mi, ПК, web, Інтернет
Zadacha pro hid konya zadacha pro znahodzhennya marshrutu shahovogo konya sho prohodit cherez usi polya shahivnici po odnomu razu Hid konya na shahovij doshci yakij vidviduye vsi klitinki Animaciya prohodzhennya konya cherez usi klitinki polya shahovoyi doshki 5 x 5 Cya zadacha vidoma prinajmni z XVIII stolittya Leonard Ejler prisvyativ yij veliku robotu Virishennya odnogo cikavogo pitannya yake zdayetsya ne pidporyadkovuyetsya zhodnomu doslidzhennyu datuyetsya 26 kvitnya 1757 roku U listi do Goldbaha vin povidomlyav Spogad pro zaproponovane kolis meni zavdannya posluzhiv dlya mene neshodavno privodom do deyakih tonkih vishukuvan do yakih zvichajnij analiz yak zdayetsya ne maye niyakogo zastosuvannya Ya znajshov nareshti yasnij sposib znahoditi skilki zavgodno rishen chislo yih odnak ne neskinchenne ne roblyachi prob Okrim rozglyadu zavdannya dlya konya Ejler rozibrav analogichni zavdannya i dlya inshih figur U terminah teoriyi grafiv kozhen marshrut konya sho prohodit cherez vsi polya shahivnici vidpovidaye gamiltonovomu shlyahu abo ciklu yaksho marshrut zamknenij u grafi hodiv konya grafi vershinami yakogo ye polya doshki i dva polya z yednani rebrom yaksho z odnogo mozhna potrapiti na inshe za odin hid konya Kilkist vsih zamknutih marshrutiv konya gamiltonovih cikliv bez urahuvannya napryamku obhodu dorivnyuye 13 267 364 410 532 kilkist zamknutih marshrutiv z urahuvannyam napryamku v dva razi bilshe U toj zhe chas zavdannya pidrahunku vsih mozhlivih nezamknutih marshrutiv znachno skladnishe i ne virishene dosi Vidomo sho kilkist nezamknutih marshrutiv ne perevishuye chisla spoluchen 168 63 1 2 10 47 displaystyle binom 168 63 approx 1 2 cdot 10 47 Metodi virishennyaMetod Ejlera i Vandermonda Metod Ejlera Metod Ejlera polyagaye v tomu sho spochatku kin ruhayetsya za dovilnim marshrutom poki ne vicherpaye vsi mozhlivi hodi Potim neprojdeni klitinki sho zalishilisya dodayutsya v zroblenij marshrut pislya specialnoyi perestanovki jogo elementiv Rozglyanemo yak priklad nastupnij marshrut 55 58 29 40 27 44 19 22 60 39 56 43 30 21 26 45 57 54 59 28 41 18 23 20 38 51 42 31 8 25 46 17 53 32 37 a 47 16 9 24 50 3 52 33 36 7 12 15 1 34 5 48 b 14 c 10 4 49 2 35 6 11 d 13 Spochatku sprobuyemo z nezamknenogo marshrutu zrobiti zamknenij Dlya cogo rozglyanemo kudi mozhna piti z poliv 1 ta 60 Z polya 1 mozhna piti na polya 2 32 i 52 a z 60 na 29 51 i 59 U cih dvoh naborah ye polya sho rozriznyayutsya na odinicyu a same 51 i 52 Zavdyaki comu mozhna zrobiti marshrut zamknutim zvernuvshi jogo chastini Dlya cogo pronumeruyemo polya z 52 po 60 v zvorotnomu poryadku Pislya cogo mi otrimayemo zamknenij marshrut 57 54 29 40 27 44 19 22 52 39 56 43 30 21 26 45 55 58 53 28 41 18 23 20 38 51 42 31 8 25 46 17 59 32 37 a 47 16 9 24 50 3 60 33 36 7 12 15 1 34 5 48 b 14 c 10 4 49 2 35 6 11 d 13 Teper mozhna dodati v marshrut deyaki z neprojdenih klitinok Oskilki nash marshrut zamknenij to jogo mozhna rozirvati v dovilnomu misci i do odnogo z kinciv prichepiti vidpovidnij lancyuzhok z neprojdenih klitinok Napriklad yaksho rozirvati lancyuzhok u klitinci 51 perenumeruvati klitinki i zrobivshi yiyi ostannoyu a 52 pershoyu to zmozhemo podovzhiti nash lancyuzhok na klitinki a b i d yaki stanut klitinkami 61 62 i 63 Metod Vandermonda Aleksandr Vandermond sprobuvav zvesti zadachu do arifmetichnoyi Dlya cogo vin poznachav marshrut konya po doshci u viglyadi poslidovnosti drobiv x y displaystyle frac x y de x i y koordinati polya na doshci Ochevidno sho v poslidovnosti drobiv sho vidpovidaye hodam konya riznicya chiselnikiv dvoh susidnih drobiv mozhe buti tilki 1 abo 2 pritomu sho riznicya yih znamennikiv stanovit vidpovidno 2 abo 1 Krim togo chiselnik i znamennik ne mozhut buti menshe 1 i bilshe 8 Jogo metod znahodzhennya vidpovidnoyi poslidovnosti analogichnij metodu Ejlera ale dozvolyaye znahoditi marshruti konya tilki dlya doshki parnoyi rozmirnosti Ramkovij metod Munka i Kollin Metod podilu na chverti Polinyaka i Rozhe Pravilo Varnsdorfa Pravilo Varnsdorfa sho ye riznovidom zhadibnogo algoritmu dlya vidshukannya marshrutu konya formulyuyetsya tak Pri obhodi doshki kin povinen stavati na te pole z yakogo mozhna piti na minimalne chislo she ne projdenih poliv Yaksho takih poliv kilka to mozhna piti na bud yake z nih Cikavi marshrutiMarshrut Yanisha 50 11 24 63 14 37 26 35 23 62 51 12 25 34 15 38 10 49 64 21 40 13 36 27 61 22 9 52 33 28 39 16 48 7 60 1 20 41 54 29 59 4 45 8 53 32 17 42 6 47 2 57 44 19 30 55 3 58 5 46 31 56 43 18 Cej marshrut cikavij u bagatoh vidnoshennyah vin utvoryuye napivmagichnij kvadrat a pri povoroti doshki na 180 persha polovina marshrutu nomeri z 1 do 32 perehodit u drugu nomeri z 33 po 64 Uzagalnennya na dovilni doshkiZamknuti marshruti Kilkist zamknutih marshrutiv z urahuvannyam napryamku v dva razi bilsha Zamkneni marshruti isnuyut na doshkah n n displaystyle n times n dlya vsih parnih n 6 displaystyle n geqslant 6 poslidovnist A001230 z Onlajn enciklopediyi poslidovnostej cilih chisel OEIS Nezamknuti marshruti Dlya nekvadratnih doshok nezamknenij obhid konem isnuye tilki pri vikonanni takih umov yaksho odna storona doshki dorivnyuye 3 to insha povinna buti abo 4 abo ne menshe 7 yaksho zh obidvi storoni bilshi 3 to obhid konem mozhlivij na vsih doshkah krim 4 4 Zokrema nezamknuti marshruti isnuyut na kvadratnih doshkah n n displaystyle n times n dlya vsih n 5 displaystyle n geqslant 5 Kilkist nezamknutih marshrutiv na doshkah n n displaystyle n times n utvoryuye poslidovnist A165134 z Onlajn enciklopediyi poslidovnostej cilih chisel OEIS Realizaciya zadachi pro hid konya movoyu programuvannya S Nizhche navedeno programnu realizaciyu movoyu programuvannya S include stdafx h include lt stdlib h gt include lt stdio h gt include lt iostream gt include lt time h gt using namespace std define move types 8 int possible moves move types 2 1 2 2 1 2 1 1 2 1 2 2 1 1 2 2 1 int global int size x size y int max moves back ret int move possible int x int y return x gt 0 amp amp y gt 0 amp amp x lt size x amp amp y lt size y amp amp global x y 0 int find path int cur x int cur y int move num int next x 0 next y 0 global cur x cur y move num if move num gt max moves return 1 for int i 0 i lt move types i next x cur x possible moves i 0 next y cur y possible moves i 1 if move possible next x next y amp amp find path next x next y move num 1 return 1 global cur x cur y 0 back ret move num return 0 void main setlocale LC ALL int i nrows ncols sy sx desc NULL time t start end cout lt lt Vvedit rozmir doshki vid 2 do 8 lt lt endl lt lt po osi X t cin gt gt size x cout lt lt po osi Y t cin gt gt size y if size x gt 8 size x lt 2 size y gt 8 size y lt 2 cout lt lt Nepravilnij rozmir system pause return cout lt lt Vvedit pochatkovi koordinati lt lt endl lt lt Koordinata po osi X t cin gt gt sx cout lt lt Koordinata po osi Y t cin gt gt sy desc int malloc sizeof int size x for i 0 i lt size x i desc i int malloc sizeof int size y back ret 0 global desc max moves size x size y 1 for int i 0 i lt size x i for int j 0 j lt size y j global i j 0 if find path sx sy 1 cout lt lt lt lt endl lt lt t Rozv yazok lt lt endl lt lt lt lt endl for int i 0 i lt size x i cout lt lt endl for int j 0 j lt size y j cout lt lt global i j lt lt t cout lt lt endl cout lt lt lt lt endl else cout lt lt Nemaye rozv yazku lt lt endl for i 0 i lt size x i free desc i free desc system pause Div takozhSim mostiv Kenigsberga Graf hodiv konyaPrimitkiBrendan McKay 1997 Technical Report TR CS 97 03 Department of Computer Science Australian National University Arhiv originalu za 27 sichnya 2012 Procitovano 31 grudnya 2010 E Gik Glava 2 Kin hameleon Shahi i matematika M Nauka Bibliotechka Kvant z dzherela 26 lipnya 2020 A Conrad T Hindrichs H Morsy I Wegener 1994 Solution of the Knight s Hamiltonian Path Problem on Chessboards Discr Appl Math 50 125 134 doi 10 1016 0166 218X 92 00170 Q PosilannyaRediscovery of the Knight s Tour 1725 1825 5 travnya 2009 u Wayback Machine angl Ce nezavershena stattya z matematiki Vi mozhete dopomogti proyektu vipravivshi abo dopisavshi yiyi