Чтобы перемешать пятнашки, нужно рандомно заполнить первые 15 ячеек числами от 1 до 15 (16-я пустая).
Далее нужно проверить будет ли складываться полученная комбинация. Если не будет, нужно поменять местами любые 2 числа.
Как я понимаю проблема именно в том чтобы проверить является ли полученная комбинация корректной, т.е. складываемой?
Вот, навскидку прикинул, не проверял в действии, если где ошибся то смысл все равно понятен, сможете сами исправить:
допустим у нас есть масив
A[1..15]: array of integer;
тогда функция проверки (на Delphi) будет выглядеть так (правда при проверке она испортит проверяемый массив, так что нужно либо сделать заранее копию массива, либо чуть изменить алгоритм).
function check:boolean;
var
p,k,i:integer;
begin
Result:=true;
for i:=1 to 14 do
begin
p:=i;
while i<>A[p] do
begin
k:=p;
p:=A[p];
A[k]:=k;
Result:= not Result;
end;
A[p]:=p;
end;
end;
Смысл в том что мы перебираем все закольцованные цепочки переставленных элементов.
допустим a[1]=4, a[4]=10, a[10]=1, тогда у нас это является цепочкой с длинной 3
каждая цепочка с четным числом элементов инвертирует значение функции, а с нечетным не меняет.