Задача про вісім ферзів полягає в такому розміщенні восьми ферзів на шахівниці, що жодна з них не ставить під удар один одного. Тобто, вони не повинні стояти в одній вертикалі, горизонталі чи діагоналі. Задача про вісім ферзів є прикладом загальної задачі про n ферзів: задачі розміщення n ферзів на шахівниці розміром n × n, яка має розв'язки для n = 1 або n ≥ 4.
a | b | c | d | e | f | g | h | ||
8 | 8 | ||||||||
7 | 7 | ||||||||
6 | 6 | ||||||||
5 | 5 | ||||||||
4 | 4 | ||||||||
3 | 3 | ||||||||
2 | 2 | ||||||||
1 | 1 | ||||||||
a | b | c | d | e | f | g | h |
Задача має 92 розв'язки. Якщо відкинути схожі композиції з точністю до відбиття (віддзеркалення позиції на шахівниці) та обертання (обертання позиції на шахівниці), залишиться 12 унікальних розв'язків.
Історія
Задачу показав у 1848 р. шахіст Макс Фрідріх Бецель (нім. Max Friedrich William Bezzel), і вже через три роки математики, зокрема, Карл Гаус, працювали над пошуком її розв'язків та узагальненого варіанту. Перші розв'язки були знайдені Францом Науком (Franz Nauck) 1850 р. Також Наук запропонував розширити задачу до n ферзів (на шахівниці розміром n × n). 1874 р. Ґюнтер (S. Günther) запропонував метод пошуку розв'язків із використанням визначників, а Джеймс Глейшер (англ. James Whitbread Lee Glaisher) його вдосконалив.
Едсгер Дейкстра використав цю задачу 1972 р. аби показати можливості того, що він назвав структурним програмуванням. Він надрукував докладне описання розробки алгоритму пошуку в глибину з поверненням.
Алгоритми пошуку розв'язків
Рекурсивний алгоритм з поверненням
Задача про ферзів є прикладом простої, але не тривіальної задачі, яку можна розв'язати із допомогою рекурсивного алгоритму, оскільки задача з n ферзями може бути представлена як задача розміщення ферзя для розв'язку з n − 1 ферзями. Нарешті, задачу можна звести до задачі з 8 ферзями, розв'язком якої є порожня шахівниця.
Наступна програма мовою Python знаходить всі розв'язки для задачі з n ферзями використовуючи рекурсивний алгоритм. Він рекурсивно досліджує шахівниці розміром n × n, n × n − 1, n × n − 2, …
В програмі враховано те, що ферзі не можуть стояти на одному рядку.
Також враховано те, що розв'язок з n − 1 ферзями на шахівниці n × n − 1 містить в собі розв'язок задачі з n − 2 ферзями на шахівниці розміром n × n − 2.
Тобто, алгоритм також отримує всі розв'язки, які входять до знайденого розв'язку на менших шахівницях.
Для шахівниці 8×8 програма переглядає 15 720 позицій.
def queenproblem(rows, cols): if rows <= 0: return [[]] # порожня дошка є розв'язком для випадку без ферзів else: return add_queen(rows - 1, cols, queenproblem(rows - 1, cols)) # Переглянути всі комбінації для часткового розв'язку, # для яких можна додати ферзя в «new_row». # Якщо відсутні конфлікти з частковим розв'язком, # тоді знайдено новий розв'язок для додаткового рядка. def add_queen(new_row, cols, known_solutions): new_solutions = [] for solution in known_solutions: # спробувати розмістити ферзя в кожну комірку додаткового рядка for new_column in range(cols): # print('Спроба: %s в рядку %s' % (new_column, new_row)) if no_conflict(new_row, new_column, solution): # відсутні конфлікти, цей варіант є розв'язком new_solutions.append(solution + [new_column]) return new_solutions # Перевіряє, чи можна поставити ферзя в комірку «new_column»/«new_row» так, # аби не ставити під удар вже розміщенні ферзі def no_conflict(new_row, new_column, solution): # Переконатись, що новий ферзь не знаходиться на одній колонці або діагоналі for row in range(new_row): if solution[row] == new_column or # Збігаються колонки solution[row] + row == new_column + new_row or # Збігається діагональ solution[row] - row == new_column - new_row: # Збігається діагональ return False return True
Цей рекурсивний алгоритм можна перетворити на ітеративний алгоритм без рекурсії.
Реалізація задачі про вісім ферзів на мові програмування С++
#include "stdafx.h" #include <iostream> using namespace std; int main(){ int q[8],c,i; int count = 1; q[0] = 0; c = 0; NC: c++; if(c == 8) goto print; q[c] = -1; NR: q[c]++; if(q[c] == 8) goto back; for (i = 0; i < c; i++) { if((q[i] == q[c]) || ((c - i) == abs(q[c] - q[i]))) goto NR;} goto NC; back: c--; if (c == -1) return 0; goto NR; print: cout << endl; cout << "#" << count << endl; for(i = 0;i < 8; i++){ cout << q[i] << " "; } cout << endl; count++; goto back; system("pause"); return 0; }
Програмування в обмеженнях
Засобами програмування в обмеженнях в обмеженій області визначення можна сформулювати задачу про ферзів компактніше.
Наступна програма мовою Пролог (діалект ) швидко знаходить розв'язок і для задач на більших шахівницях.
/* Цей предикат створює список, який відповідає розв'язку задачі. Список містить числа від 1 до N без повторів. */ n_queens(N,Ls) :- length(Ls,N), fd_domain(Ls,1,N), fd_all_different(Ls), constraint_queens(Ls), fd_labeling(Ls,[variable_method(random)]). /* Цей предикат вірний, якщо розміщення ферзів задовольняє умовам задачі */ constraint_queens([]). constraint_queens([X|Xs]) :- not_beats(X,Xs,1), constraint_queens(Xs). /* Цей предикат вірний, якщо дві дами не стоять на одній діагоналі */ not_beats(_,[],_). not_beats(X,[Y|Xs],N) :- X#\=Y+N, X#\=Y-N, T#=N+1, not_beats(X,Xs,T).
Розв'язки
Класична задача
Всього задача про вісім ферзів має 92 розв'язки, але відкинувши розв'язки, які можна отримати відбиттям (віддзеркаленням позиції) та обертанням (обертанням позиції на шахівниці) лишиться 12 унікальних розв'язків. Оскільки кожен унікальний розв'язок має чотири відбиття (через діагональ, горизонталь, вертикаль, та середину шахівниці), та чотири повороти, можна отримати 8·12 = 96 розв'язки. Оскільки один з розв'язків (діаграма № 12), залишається незмінним при повороті на 180°, з нього можна отримати лише чотири розв'язки. Завдяки йому, загальна кількість розв'язків класичної задачі дорівнює 92.
Нижче наведено унікальні розв'язки задачі для 8 ферзів.
| q1 8
|
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
|
Узагальнена задача
Узагальнена задача про ферзів полягає в розміщенні n ферзів на шахівниці розміром n × n.
Кількість розв'язків на шахівницях до 26 × 26
В наступній таблиці наведено кількість унікальних розв'язків та загальну кількість розв'язків для задач про ферзі на шахівницях розміром до 26 × 26.
n | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
унікальних | 1 | 0 | 0 | 1 | 2 | 1 | 6 | 12 | 46 | 92 | 341 | 1 787 | 9233 | 45 752 | 285 053 | 1 846 955 | 11 977 939 | 83 263 591 |
взагалі | 1 | 0 | 0 | 2 | 10 | 4 | 40 | 92 | 352 | 724 | 2680 | 14 200 | 73 712 | 365 596 | 2 279 184 | 14 772 512 | 95 815 104 | 666 090 624 |
n | 19 | 20 | 21 | 22 | 23 | 24 |
---|---|---|---|---|---|---|
унікальних | 621 012 754 | 4 878 666 808 | 39 333 324 973 | 336 376 244 042 | 3 029 242 658 210 | 28 439 272 956 934 |
взагалі | 4 968 057 848 | 39 029 188 884 | 314 666 222 712 | 2 691 008 701 644 | 24 233 937 684 440 | 227 514 171 973 736 |
n | 25 (світовий рекорд 2005 р.) | 26 (світовий рекорд 2009 р.) |
---|---|---|
унікальних | 275 986 683 743 434 | 2 789 712 466 510 289 |
взагалі | 2 207 893 435 808 352 | 22 317 699 616 364 044 |
На той час відома, але не перевірена кількість розв'язків для n = 12, була підтверджена 1969 р. незалежно Торбьорном Ліндельофом (нім. Torbjörn Lindelöf) та Берндом Шварцкопфом (нім. Bernd Schwarzkopf) на комп'ютері. Ліндельофу також вдалось обчислити кількість розв'язків для n = 13 та n = 14. 1970 р. Ліндельофу вдалось обчислити кількість розв'язків для n = 15.
Кількість розв'язків для n = 26 була обчислена 11 липня 2009 р. проектом Queens@TUD із використанням FPGA-процесорів, а 30 серпня 2009 р. була підтверджена проектом MC#на двох російських суперкомп'ютерах зі списку TOP500.
Взагалі, можна стверджувати, що кількість розв'язків зростає дещо швидше за експоненційну. Слід відмітити, що кількість розв'язків для шахівниць 2 × 2 та 6 × 6 менша, аніж на шахівницях меншого від них розміру.
Кількість розв'язків для довільних n
Верхня границя кількості розв'язків D(n) задачі розміру n дорівнює n!, що дорівнює кількості розв'язків для n тур. Кількість ферзів, які не ставлять під удар одна одну, набагато менша за це число.
Асимптотична форма для D(n) не відома. Рівін та інші припускають, що:
- .
Відомі результати дозволяють ще більше звузити оцінку для великих n до: , де .
Див. також
Примітки
- O.-J. Dahl, Edsger W. Dijkstra, C. A. R. Hoare Structured Programming, Academic Press, London, 1972
- Karl Fabel: Das n-Damen-Problem. In: , Heft 1, Oktober 1969. S. 20
- Karl Fabel: Das n-Damen-Problem. In: Die Schwalbe, Heft 5, September 1970. S. 146
- . Архів оригіналу за 10 листопада 2017. Процитовано 13 квітня 2019.
- . Архів оригіналу за 1 березня 2012. Процитовано 3 січня 2011.
- I. Rivin, I. Vardi, P. Zimmermann: The n-Queens Problem. In: The American Mathematical Monthly. Band 101, 1994, S. 629—639
- послідовність A000170 з Онлайн енциклопедії послідовностей цілих чисел, OEIS
Література
- John J. Watkins: Across the Board: The Mathematics of Chess Problems. Princeton University Press, Princeton 2004, .
Посилання
- (англ.)
- Програма для розв'язання задачі з n ферзями, приблизно в 4 рази швидше за попередню [ 18 травня 2011 у Wayback Machine.](англ.)
- Розв'язки задачі 8 ферзів [ 1 січня 2011 у Wayback Machine.](англ.)
- Стаття MathWorld [ 3 липня 2019 у Wayback Machine.](англ.)
- Сторінка Durango Bills присвячена задачі n ферзів [ 5 січня 2011 у 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 visim ferziv polyagaye v takomu rozmishenni vosmi ferziv na shahivnici sho zhodna z nih ne stavit pid udar odin odnogo Tobto voni ne povinni stoyati v odnij vertikali gorizontali chi diagonali Zadacha pro visim ferziv ye prikladom zagalnoyi zadachi pro n ferziv zadachi rozmishennya n ferziv na shahivnici rozmirom n n yaka maye rozv yazki dlya n 1 abo n 4 abcdefgh8877665544332211abcdefghOdin z rozv yazkiv zadachi pro visim ferziv Zadacha maye 92 rozv yazki Yaksho vidkinuti shozhi kompoziciyi z tochnistyu do vidbittya viddzerkalennya poziciyi na shahivnici ta obertannya obertannya poziciyi na shahivnici zalishitsya 12 unikalnih rozv yazkiv IstoriyaZadachu pokazav u 1848 r shahist Maks Fridrih Becel nim Max Friedrich William Bezzel i vzhe cherez tri roki matematiki zokrema Karl Gaus pracyuvali nad poshukom yiyi rozv yazkiv ta uzagalnenogo variantu Pershi rozv yazki buli znajdeni Francom Naukom Franz Nauck 1850 r Takozh Nauk zaproponuvav rozshiriti zadachu do n ferziv na shahivnici rozmirom n n 1874 r Gyunter S Gunther zaproponuvav metod poshuku rozv yazkiv iz vikoristannyam viznachnikiv a Dzhejms Glejsher angl James Whitbread Lee Glaisher jogo vdoskonaliv Edsger Dejkstra vikoristav cyu zadachu 1972 r abi pokazati mozhlivosti togo sho vin nazvav strukturnim programuvannyam Vin nadrukuvav dokladne opisannya rozrobki algoritmu poshuku v glibinu z povernennyam Algoritmi poshuku rozv yazkivRekursivnij algoritm z povernennyam Priklad roboti rekursivnogo algoritmu z povernennyam Zadacha pro ferziv ye prikladom prostoyi ale ne trivialnoyi zadachi yaku mozhna rozv yazati iz dopomogoyu rekursivnogo algoritmu oskilki zadacha z n ferzyami mozhe buti predstavlena yak zadacha rozmishennya ferzya dlya rozv yazku z n 1 ferzyami Nareshti zadachu mozhna zvesti do zadachi z 8 ferzyami rozv yazkom yakoyi ye porozhnya shahivnicya Nastupna programa movoyu Python znahodit vsi rozv yazki dlya zadachi z n ferzyami vikoristovuyuchi rekursivnij algoritm Vin rekursivno doslidzhuye shahivnici rozmirom n n n n 1 n n 2 V programi vrahovano te sho ferzi ne mozhut stoyati na odnomu ryadku Takozh vrahovano te sho rozv yazok z n 1 ferzyami na shahivnici n n 1 mistit v sobi rozv yazok zadachi z n 2 ferzyami na shahivnici rozmirom n n 2 Tobto algoritm takozh otrimuye vsi rozv yazki yaki vhodyat do znajdenogo rozv yazku na menshih shahivnicyah Dlya shahivnici 8 8 programa pereglyadaye 15 720 pozicij def queenproblem rows cols if rows lt 0 return porozhnya doshka ye rozv yazkom dlya vipadku bez ferziv else return add queen rows 1 cols queenproblem rows 1 cols Pereglyanuti vsi kombinaciyi dlya chastkovogo rozv yazku dlya yakih mozhna dodati ferzya v new row Yaksho vidsutni konflikti z chastkovim rozv yazkom todi znajdeno novij rozv yazok dlya dodatkovogo ryadka def add queen new row cols known solutions new solutions for solution in known solutions sprobuvati rozmistiti ferzya v kozhnu komirku dodatkovogo ryadka for new column in range cols print Sproba s v ryadku s new column new row if no conflict new row new column solution vidsutni konflikti cej variant ye rozv yazkom new solutions append solution new column return new solutions Pereviryaye chi mozhna postaviti ferzya v komirku new column new row tak abi ne staviti pid udar vzhe rozmishenni ferzi def no conflict new row new column solution Perekonatis sho novij ferz ne znahoditsya na odnij kolonci abo diagonali for row in range new row if solution row new column or Zbigayutsya kolonki solution row row new column new row or Zbigayetsya diagonal solution row row new column new row Zbigayetsya diagonal return False return True Cej rekursivnij algoritm mozhna peretvoriti na iterativnij algoritm bez rekursiyi Realizaciya zadachi pro visim ferziv na movi programuvannya S include stdafx h include lt iostream gt using namespace std int main int q 8 c i int count 1 q 0 0 c 0 NC c if c 8 goto print q c 1 NR q c if q c 8 goto back for i 0 i lt c i if q i q c c i abs q c q i goto NR goto NC back c if c 1 return 0 goto NR print cout lt lt endl cout lt lt lt lt count lt lt endl for i 0 i lt 8 i cout lt lt q i lt lt cout lt lt endl count goto back system pause return 0 Programuvannya v obmezhennyah Zasobami programuvannya v obmezhennyah v obmezhenij oblasti viznachennya mozhna sformulyuvati zadachu pro ferziv kompaktnishe Nastupna programa movoyu Prolog dialekt shvidko znahodit rozv yazok i dlya zadach na bilshih shahivnicyah Cej predikat stvoryuye spisok yakij vidpovidaye rozv yazku zadachi Spisok mistit chisla vid 1 do N bez povtoriv n queens N Ls length Ls N fd domain Ls 1 N fd all different Ls constraint queens Ls fd labeling Ls variable method random Cej predikat virnij yaksho rozmishennya ferziv zadovolnyaye umovam zadachi constraint queens constraint queens X Xs not beats X Xs 1 constraint queens Xs Cej predikat virnij yaksho dvi dami ne stoyat na odnij diagonali not beats not beats X Y Xs N X Y N X Y N T N 1 not beats X Xs T Rozv yazkiKlasichna zadacha Vsogo zadacha pro visim ferziv maye 92 rozv yazki ale vidkinuvshi rozv yazki yaki mozhna otrimati vidbittyam viddzerkalennyam poziciyi ta obertannyam obertannyam poziciyi na shahivnici lishitsya 12 unikalnih rozv yazkiv Oskilki kozhen unikalnij rozv yazok maye chotiri vidbittya cherez diagonal gorizontal vertikal ta seredinu shahivnici ta chotiri povoroti mozhna otrimati 8 12 96 rozv yazki Oskilki odin z rozv yazkiv diagrama 12 zalishayetsya nezminnim pri povoroti na 180 z nogo mozhna otrimati lishe chotiri rozv yazki Zavdyaki jomu zagalna kilkist rozv yazkiv klasichnoyi zadachi dorivnyuye 92 Nizhche navedeno unikalni rozv yazki zadachi dlya 8 ferziv abcdefgh8877665544332211abcdefghUnikalnij rozv yazok 1 q1 8 abcdefgh8877665544332211abcdefghUnikalnij rozv yazok 2 abcdefgh8877665544332211abcdefghUnikalnij rozv yazok 3abcdefgh8877665544332211abcdefghUnikalnij rozv yazok 4 abcdefgh8877665544332211abcdefghUnikalnij rozv yazok 5 abcdefgh8877665544332211abcdefghUnikalnij rozv yazok 6abcdefgh8877665544332211abcdefghUnikalnij rozv yazok 7 abcdefgh8877665544332211abcdefghUnikalnij rozv yazok 8 abcdefgh8877665544332211abcdefghUnikalnij rozv yazok 9abcdefgh8877665544332211abcdefghUnikalnij rozv yazok 10 abcdefgh8877665544332211abcdefghUnikalnij rozv yazok 11 abcdefgh8877665544332211abcdefghUnikalnij rozv yazok 12Uzagalnena zadacha Uzagalnena zadacha pro ferziv polyagaye v rozmishenni n ferziv na shahivnici rozmirom n n Kilkist rozv yazkiv na shahivnicyah do 26 26 V nastupnij tablici navedeno kilkist unikalnih rozv yazkiv ta zagalnu kilkist rozv yazkiv dlya zadach pro ferzi na shahivnicyah rozmirom do 26 26 n 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18unikalnih 1 0 0 1 2 1 6 12 46 92 341 1 787 9233 45 752 285 053 1 846 955 11 977 939 83 263 591vzagali 1 0 0 2 10 4 40 92 352 724 2680 14 200 73 712 365 596 2 279 184 14 772 512 95 815 104 666 090 624n 19 20 21 22 23 24unikalnih 621 012 754 4 878 666 808 39 333 324 973 336 376 244 042 3 029 242 658 210 28 439 272 956 934vzagali 4 968 057 848 39 029 188 884 314 666 222 712 2 691 008 701 644 24 233 937 684 440 227 514 171 973 736n 25 svitovij rekord 2005 r 26 svitovij rekord 2009 r unikalnih 275 986 683 743 434 2 789 712 466 510 289vzagali 2 207 893 435 808 352 22 317 699 616 364 044 Na toj chas vidoma ale ne perevirena kilkist rozv yazkiv dlya n 12 bula pidtverdzhena 1969 r nezalezhno Torbornom Lindelofom nim Torbjorn Lindelof ta Berndom Shvarckopfom nim Bernd Schwarzkopf na komp yuteri Lindelofu takozh vdalos obchisliti kilkist rozv yazkiv dlya n 13 ta n 14 1970 r Lindelofu vdalos obchisliti kilkist rozv yazkiv dlya n 15 Kilkist rozv yazkiv dlya n 26 bula obchislena 11 lipnya 2009 r proektom Queens TUD iz vikoristannyam FPGA procesoriv a 30 serpnya 2009 r bula pidtverdzhena proektom MC na dvoh rosijskih superkomp yuterah zi spisku TOP500 Vzagali mozhna stverdzhuvati sho kilkist rozv yazkiv zrostaye desho shvidshe za eksponencijnu Slid vidmititi sho kilkist rozv yazkiv dlya shahivnic 2 2 ta 6 6 mensha anizh na shahivnicyah menshogo vid nih rozmiru Kilkist rozv yazkiv dlya dovilnih n Verhnya granicya kilkosti rozv yazkiv D n zadachi rozmiru n dorivnyuye n sho dorivnyuye kilkosti rozv yazkiv dlya n tur Kilkist ferziv yaki ne stavlyat pid udar odna odnu nabagato mensha za ce chislo Asimptotichna forma dlya D n ne vidoma Rivin ta inshi pripuskayut sho limn log D n nlog n b gt 0 displaystyle lim n to infty frac log D n n log n beta gt 0 Vidomi rezultati dozvolyayut she bilshe zvuziti ocinku dlya velikih n do D n n cn displaystyle D n approx n cdot c n de c 0 39 displaystyle c approx 0 39 Div takozhPortal Matematika Shahova kompoziciyaPrimitkiO J Dahl Edsger W Dijkstra C A R Hoare Structured Programming Academic Press London 1972 ISBN 0 12 200550 3 Karl Fabel Das n Damen Problem In Heft 1 Oktober 1969 S 20 Karl Fabel Das n Damen Problem In Die Schwalbe Heft 5 September 1970 S 146 Arhiv originalu za 10 listopada 2017 Procitovano 13 kvitnya 2019 Arhiv originalu za 1 bereznya 2012 Procitovano 3 sichnya 2011 I Rivin I Vardi P Zimmermann The n Queens Problem In The American Mathematical Monthly Band 101 1994 S 629 639 poslidovnist A000170 z Onlajn enciklopediyi poslidovnostej cilih chisel OEISLiteraturaJohn J Watkins Across the Board The Mathematics of Chess Problems Princeton University Press Princeton 2004 ISBN 0 691 11503 6 Posilannya angl Programa dlya rozv yazannya zadachi z n ferzyami priblizno v 4 razi shvidshe za poperednyu 18 travnya 2011 u Wayback Machine angl Rozv yazki zadachi 8 ferziv 1 sichnya 2011 u Wayback Machine angl Stattya MathWorld 3 lipnya 2019 u Wayback Machine angl Storinka Durango Bills prisvyachena zadachi n ferziv 5 sichnya 2011 u Wayback Machine angl