﻿Не е трудно да се докаже чрез принципа на Дирихле,
че върху шахматна дъска 8 x 8 могат да се разположат
най-много 16 царя, без да се заплашват.
Колко такива разположения съществуват?

Не е известно чисто комбинаторно решение (без компютър),
а броят на всички възможности (комбинации 16 от 64)
е твърде голям за пълно изчерпване. 
Възможно е обаче да се намали броят на случаите.

Първи начин: Разделяме дъската на 16 квадрата 2 x 2,
във всеки от които има точно по един цар.
Във всеки от четирите двойни реда левите царе са наляво от десните.
Във всеки от четирите двойни стълба горните царе са нагоре от долните.
Следователно всяка позиция се описва от наредена осморка
от цели числа между 0 и 4 включително: 
броят на левите/горните царе във всеки ред/стълб.
Това са общо 5^8 (приблизително 400000) позиции,
които вече могат да бъдат проверени с пълно изчерпване
(с помощта на компютър). Проверката е необходима,
защото царете могат да се заплашват и по диагонал.

Втори начин: Динамично програмиране.
Съществуват 55 възможни разположения на царе
(без взаимни заплахи) в един стълб 1 x 8 (вкл. празен).
Нека cnt(k) е броят на царете (от 0 до 4) в k-тото разположение.
Чрез компютър проверяваме кои двойки разположения са съвместими
(т.е. двата стълба могат да бъдат долепени без взаимни заплахи).
Динамична таблица:
dyn[0..8][0..16][1..55]: array of integers;
dyn[i][j][k] = броят на начините, по които може да се разположат j царя
върху шахматна дъска с 8 реда и i стълба така, че да не се атакуват
и до последния стълб да може да се долепи (без заплахи) k-тият от 55-те стълба.
Инициализация:
  dyn[0][0][k] = 1 за всяко k = 1..55; 
  dyn[0][j][k] = 0 за всяко k = 1..55 и всяко j = 1..16.
Рекурентна стъпка:
  dyn[i][j][k] = sum dyn[i-1][j-cnt(k')][k'],
където сумата е по всички k' от 1 до 55, съвместими с k и такива, че cnt(k') <= j.
Таблицата се попълва от компютърна програма. Накрая
return dyn[8][16][1], където 1 е номерът на празния от 55-те стълба
(което означава липса на ограничения за последния/осмия стълб на дъската).

Трети начин: с теорията на графите.
Разглеждаме 55-те възможни запълвания на всеки стълб (вж. предишното решение)
като върхове на граф. Графът има два вида ребра:
--- Първият вид ребра свързват върхове, които отговарят на стълбове,
    които могат да се долепят без създаване на заплахи.
--- Вторият вид ребра свързват върхове, които отговарят на стълбове,
    които могат да се долепят без създаване на заплахи
    и в които има общо четири царя.
Нека A е матрицата на съседствата на графа, образуван от първия вид ребра;
нека B е матрицата на съседствата на графа, образуван от втория вид ребра.
Броят на търсените разположения е равен на броя на пътищата с дължина 7,
в които първото, третото, петото и седмото ребро са от втория вид,
а останалите ребра са от първия вид. Числото 7 е броят на преходите
(от първия към втория стълб на дъската, от втория към третия и т.н.).
Като докажем вариант на теоремата за връзка между броя на пътищата в граф 
и степента на матрицата на съседствата,
получаваме, че броят на пътищата от разглеждания вид
е равен на сбора на елементите на матрицата BABABAB = ((BA)^3)B.

Трите начина са програмирани на езика Паскал (вж. ZIP файловете).
Броят на възможните разположения на 16 царя върху дъска 8 x 8 е 281571.
