Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
met.uk.po-MPPSP (1).doc
Скачиваний:
1
Добавлен:
22.11.2019
Размер:
1.05 Mб
Скачать

3.1.4. Процедура построения дерева достижимости.

procedure TForm1.BuildTree(par_str:string;level:integer;mar:array of integer);

var

i,k,j:integer;

s,snew:string;

isdouble,isopen:boolean;

new_mar:array of integer;

minlev:integer;

ElemToExecute:integer;

index:integer;

begin

SetLength(new_mar,n);

for i:=1 to m do //i - номер перехода

begin

//проверяем открыт ли переход

isopen:=true;

for k:=1 to n do //k- номер позиции

begin

if (StrToInt(StringGrid.Cells[k,i])<=mar[k-1])and(mar[k-1]<=6)and(mar[k-1]>=0) then

new_mar[k-1]:=mar[k-1]-StrToInt(StringGrid.Cells[k,i])

else

begin

isopen:=false;

break;

end;

end;

if isopen=true then

begin

// добавляем фишки в соответствующии позиции

for k:=1 to n do //k- номер позиции

begin

new_mar[k-1]:=new_mar[k-1]+StrToInt(StringGrid1.Cells[k,i])

end;

//представляем новый массив маркировок в виде строки

snew:='';

for k:=0 to n-1 do

begin

snew:=snew+IntToStr(new_mar[k]);

end;

//проверка на дубль

isdouble:=false;

for k:=0 to tree.Items.Count-1 do

begin

if snew=tree.Items.Item[k].Text then

begin

isdouble:=true;

break;

end;

end;

if tree.Items.Count>1000 then exit;

index:=0;

while tree.Items.Item[index].text<>par_str do inc(index);

if isdouble=true then

tree.Items.AddChild(tree.Items.Item[index],snew+'(дубль)')

else

begin //добавляем в стек

//ищем свободное место

k:=0;

while (k<=StackLength)and(stack[k].level<>0)do inc(k);

if k>StackLength then

begin

//извещаем о переполнении стека

ShowMessage('Стек переполнен');

exit;

end

else

begin

//inert into tree

tree.Items.AddChild(tree.Items.Item[index],snew);

//вставляем в свободное место

stack[k].par_str:=snew;

stack[k].level:=level+1;

SetLength(stack[k].marking,n);

for j:=0 to n-1 do stack[k].marking[j]:=new_mar[j];

end;

end;

end;

end;

//выбираем из стека элемент с наименьшим уровнем

minlev:=1000;

for i:=0 to StackLength do

begin

if (stack[i].level>0)and(stack[i].level<minlev) then

begin

ElemToExecute:=i;

minlev:=Stack[i].level;

end;

end;

if minlev<1000 then

begin

stack[ElemToExecute].level:=0;

BuildTree(stack[ElemToExecute].par_str,minlev,stack[ElemToExecute].marking);

end;

end;

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]