Власне кажучи є завдання:
Знайдіть кількість способів розставити на шаховій дошці розміром N * N рівно K коней таким чином, щоб жоден з них не бив іншого. Всі коні однакові, тому якщо в якийсь розстановці поміняти місцями двох коней, то це буде та ж сама розстановка.
Вхідні дані
У єдиному рядку знаходяться два цілих числа N (1 <= N <= 6) и K (0 <= K <= N*N).
Вихідні дані
Виведіть шукану кількість способів.
Зробив завдання за допомогою рекурсивного перебору:
Var
a, c: array # 91; 0..20,0..20 # 93; of integer;
q, fact, result, j, i, k, n: longint;
dx: array # 91; 0..7 # 93; of integer = (- 2, -1, 1, 2, 2, 1, -1, -2);
dy: array # 91; 0..7 # 93; of integer = (1, 2, 2, 1, -1, -2, -2, -1);
procedure move (x, y, d: integer); // функція визначає всі клітини, які б'є кінь на координатах x і y
Var i: integer;
begin
for i: = 0 to 7 do
if (x + dx # 91; i # 93;> = 0) and (x + dx # 91; i # 93;
end;
procedure solve (size: integer); // сам перебір
var
i, j: longint;
begin
if q = 1 then exit;
if size = k then
begin
inc (result);
end
else
for i: = 0 to n-1 do
for j: = 0 to n-1 do begin a # 91; i, j # 93;: = 0; c # 91; i, j # 93;: = 0; end;
fact: = 1;
for i: = 1 to k do
fact: = fact * i;
writeln (result div fact);
Так ось, алгоритм працює, однак не вкладається в бажаний час через те, що я враховую "однакові" (за умовою завдання) розстановки. Хотілося б дізнатися спосіб, який би дозволив вирішити цю проблему.