Witam. Mam taki problem. Program chodzi normalnie dla const n<=8 (n to rozmiar szachownicy). Lecz jeżeli ustalam n>8 to program się zawiesze.
Kod programu:
unit szachy;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
BLosuj_pola: TButton;
ListBox1: TListBox;
Edit1: TEdit;
BGeneruj: TButton;
BPokaz_ustawienia: TButton;
BPokaz_wynik: TButton;
procedure BLosuj_polaClick(Sender: TObject);
procedure BGenerujClick(Sender: TObject);
procedure BPokaz_ustawieniaClick(Sender: TObject);
procedure BPokaz_wynikClick(Sender: TObject);
private { Private declarations }
public { Public declarations }
end;
var Form1: TForm1;
implementation
{$R *.dfm}
const n = 9;
type Wieze=array [1..n] of 1..n ;
Zbior = set of 1..n;
PlikWyn = file of Wieze;
Var nr:Integer;
z:Zbior;
szach: array[1..n,1..n] of Integer;
Function len(z:Zbior):Integer;
Var i, le:Integer;
Begin
Le:=0;
For i:=1 to n do
If i in z then le:=le+1;
Len:= le;
end;
Function val(z:Zbior):Integer;
Var i:Integer;
Begin
val:=0;
if Len(z)=1 then
For i:=1 to n do
If i in z then val:=i;// else val:=0;
end;
function wpisz(k,i:Integer; w:Wieze):Wieze;
Begin
w[k]:=i;
wpisz:=w;
end;
procedure generuj(k:Integer; z:zbior; w:Wieze; var f:PlikWyn);
Var
i:Integer;
Begin
if Len(z)=1 then
begin
w:=wpisz(k,val(z),w) ;
write(f,w)
end
else
begin
For i:=1 to n do
if i in z then
begin
w:=wpisz(k,i,w);
generuj(k+1, z-[i] , w, f);
end;
end;
end;
procedure TForm1.BLosuj_polaClick(Sender: TObject);
var j,i:integer;
begin
randomize;
for i:=1 to n do
for j:=1 to n do
szach[i,j]:= random(10);
end;
procedure TForm1.BGenerujClick(Sender: TObject);
var f0:PlikWyn;
w :Wieze;
begin
assignfile(f0,'c:/aa');
rewrite(f0);
z:= [1..n];
generuj(1,z,w,f0);
closefile(f0);
end;
procedure TForm1.BPokaz_ustawieniaClick(Sender: TObject);
var f0:PlikWyn;
i:integer;
nr:Longint;
w :Wieze;
s:string;
begin
nr:=0;
assignfile(f0,'c:/aa');
reset(f0);
while not eof(f0) do
begin
read(f0,w);
nr:=nr+1;
s:='';
s:=IntToStr(nr)+'. ';
for i:=1 to n do
s:= s+IntToStr(w[i])+' ';
ListBox1.Items.Add(s);
end;
end;
procedure TForm1.BPokaz_wynikClick(Sender: TObject);
var i,k0,k:integer;
f0:PlikWyn;
w0, w :Wieze;
s:string;
begin
k0:=0;
for i:=1 to n do
k0:=k0+szach[i,i];
for i:=1 to n do
w0[i]:=i;
assignfile(f0,'c:/aa');
reset(f0);
nr:=0;
while not eof(f0) do
begin
read(f0,w);
nr:=nr+1;
k:=0;
for i:=1 to n do
k:=k+szach[w[i],i];
if k>k0 then
begin
k0:=k;
w0:=w;
end;
end;
s:='Max dla ustawienia: ';
for i:=1 to n do
s:= s+IntToStr(w0[i])+' ';
s:= s+' wynosi: '+IntToStr(k0)+' ';
ListBox1.Items.Add('');
ListBox1.Items.Add(s);
end;
end.