Dobra, rozwiązanie żeby nie było :p
Kopiuj
program Project1;
{$APPTYPE CONSOLE}
uses
SysUtils, Classes;
type
TPoziom = array of Byte;
PLisc = ^TLisc;
TLisc = record
Korzen: PLisc;
Liscie: TList;
Poziom: TPoziom;
Pietro: Byte;
end;
var
ilosc_pieter, ilosc_budynkow: Byte;
Osiedle: PLisc;
function PoziomToStr(Poziom: TPoziom): string;
var
i: Integer;
begin
Result := '';
for i := 0 to Length(Poziom) - 1 do
Result := Result + IntToStr(Poziom[i]) + ' ';
end;
function DodajLisc(Lisc: PLisc): PLisc;
var
i: Integer;
begin
New(Result);
if Lisc <> nil then
begin
Lisc.Liscie.Add(Result);
Result.Pietro := Lisc.Pietro + 1;
end
else
Result.Pietro := 1;
Result.Korzen := Lisc;
Result.Liscie := TList.Create;
SetLength(Result.Poziom, ilosc_budynkow);
for i := 0 to ilosc_budynkow - 1 do
Result.Poziom[i] := 1;
end;
procedure UsunLisc(Lisc: PLisc);
var
i: Integer;
begin
if Lisc = nil then
Exit;
while Lisc.Liscie.Count > 0 do
begin
UsunLisc(Lisc.Liscie.Last);
Lisc.Liscie.Delete(Lisc.Liscie.Count - 1);
end;
Lisc.Liscie.Free;
SetLength(Lisc.Poziom, 0);
Dispose(Lisc);
end;
procedure WybudujOsiedle(Lisc: PLisc);
var
i, j: Byte;
l: PLisc;
begin
if Lisc = nil then
Exit;
for i := 0 to ilosc_budynkow - 1 do
begin
if Lisc.Poziom[i] < ilosc_pieter then
begin
l := DodajLisc(Lisc);
for j := 0 to ilosc_budynkow - 1 do
begin
if i = j then
l.Poziom[j] := Lisc.Poziom[j] + 1
else
l.Poziom[j] := Lisc.Poziom[j];
end;
WybudujOsiedle(l);
end;
end;
end;
procedure WyswietlLiscie(lisc: PLisc; p: Byte);
var
i: Integer;
l: PLisc;
begin
if lisc = nil then
Exit;
if lisc.Liscie.Count = 0 then
begin
l := lisc;
WriteLn(' ');
while l <> nil do
begin
Writeln(PoziomToStr(l.Poziom));
l := l.Korzen;
end;
end
else
for i := 0 to lisc.Liscie.Count - 1 do
WyswietlLiscie(lisc.Liscie[i], 0);
end;
var
l: PLisc;
begin
Write('Podaj ilosc pieter: ');
ReadLn(ilosc_pieter);
Write('Podaj ilosc budynkow: ');
Readln(ilosc_budynkow);
Osiedle := DodajLisc(nil);
WybudujOsiedle(Osiedle);
WyswietlLiscie(Osiedle, 1);
UsunLisc(Osiedle);
Readln;
end.
Pisane pod delphi (użycie TList, dynamicznych tablic), można zoptymalizować zużycie pamięci (zamiast wspomnianego TList użyć dynamicznej tablicy lub listy na wskaźnikach). DodajLisc i UsunLisc to najzwyklejsza implementacja drzewa. WyswietlLiscie szuka najpierw "końców" drzewa (czyli liści ale żeby typy/zmienne są ponazywane tak a nie inaczej to inna sprawa) i potem wyświetla wszystkie etapy budowy idąc aż do korzenia. Całą "magia" dzieje się w procedurze WybudujOsiedle ale to już do rozgryzienia dla pytacza