В общем.. ига такая на логику... Весь инет облазил в поисках инфы, ничего не нашел.. попалась случайно вместе с журнальчиком 777. Суть игры: Дано поле. По вертикали и горизонтали расположены числа 0..9. Каждое число предполагает наличие в в линии такого количества фрагментов кораблей. Набор кораблей стандартный. В общем прожка по идее должна выдать расстановку кораблей. Ваши соображения по поводу))))
В принципе с твоей функцией понятно. Однако у меня она будет работать немного по другому. 1. Получаем максимальнок кол-во фрагментов в линии 2. Получаем массив из 0 и 1 для порождения перестановок, где сумма 1=кол-во фрагментов на шаге 1 3. Записываем его в строку поля 4. Убираем эту линию, что бы не использовать на последующих шагах 5. Вызов рекурсии Специально не включил проверку на законченность поля, что бы убедится что стека хватит. Выдает сообщение о переполнении стека Код
Код
const n=10; type t_mas=array[0..n] of 0..1; type t_matr=array[0..n] of t_mas; function pr(const q:t_mas;s:byte):boolean; //проверка, что кол-во единиц и кол-во фрагментов совпадает var i:byte; k:byte; begin k:=0; for i:=1 to n do k:=k+q[i]; if k=s then pr:=true else pr:=false; end; function findmaxfrag(const a:t_matr):byte; //находим-макс. фрагментов из линии var i,max:byte; begin max:=0; for i:=0 to n-1 do if a[i,n] > max then max:=i; for i:=0 to n-1 do if a[n,i]>max then max:=i+n; findmaxfrag:=max; end;
var a:t_matr; j,i:byte; q1:boolean; function rekurs:byte; //сама рекурсия var i,j,t:-1 ..n; r:1..n; h,coun,l,z:byte; s:array[0..n] of 1..n; q:t_mas; begin t:=0; h:=findmaxfrag(a); if h-10 >0 then begin for j:=n downto 1 do begin q[j]:=0; t:=t+1; s[t]:=j; end; while t>=0 do begin if pr(q,a[n,h-10]) then begin for l:=0 to n-1 do a[l,h-10]:=q[l+1]; a[n,h-10]:=0; z:=rekurs; end; i:=s[t]; t:=t-1; q[i]:=1 xor q[i]; for j:=i-1 downto 1 do begin t:=t+1; s[t]:=j; end; end end else begin for j:=n downto 1 do begin q[j]:=0; t:=t+1; s[t]:=j; end; while t>=0 do begin q1:=pr(q,a[n,h]); if pr(q,a[n,h]) then begin for l:=0 to n-1 do a[h,l]:=q[l+1]; a[h,n]:=0; z:=rekurs; end; i:=s[t]; t:=t-1; q[i]:=1 xor q[i]; for j:=i-1 downto 1 do begin t:=t+1; s[t]:=j; end; end end; end; begin for i:=0 to n do for j:=0 to n do a[i,j]:=0; for j:=0 to n-1 do a[n,j]:=STRTOINT(Form1.StringGrid1.Cells[1,j+1]); for j:=0 to n-1 do a[j,n]:=STRTOINT(Form1.StringGrid1.Cells[j+1,1]); rekurs; end;
Дело даже не в передаче параметров. Просто на нижнем уровне стек переполняется. Стек самого проца. Да и переполнения на 2 шаге при пошаговом просмотре!!!