Задача про розміщення ферзів. Дерево пошуку та його обхід, Детальна інформація
Задача про розміщення ферзів. Дерево пошуку та його обхід
Як бачимо, відвідувати проміжний вузол доводиться лише двічі – на початку та в кінці обходу дерева, коренем якого він є. Для того, щоб відрізнити ці два випадки, потрібні додаткові змінні. У разі розміщень ферзів перехід від вузла до його правого брата задається збільшенням H[i] на 1. Це рівносильне одночасному виштовхуванню вузла з магазина та додаванню його правого брата. Звідси випливає, що коли обробляється вузол глибини i, в магазині є лише по одному вузлу кожної глибини m, m\xF0A3 i. Тому достатньо однієї додаткової змінної для кожної можливої глибини. Отже, означимо додатковий масив D того ж самого типу, що й масив H. Значенням D[i] стає 0, коли до вузла глибини i ми приходимо згори або зліва, та 1 – коли знизу.
Перехід до вузла знизу – це повернення до батька, і його умовою в задачі про ферзі є H[i]=n.
Повернення до кореня дерева означає кінець його обходу. Тому використаємо умову i=0 як умову закінчення пошуку. Отже, пошук повних допустимих розміщень ферзів має таке описання, яке по суті є тілом процедури пошуку:
i:=1; H[i]:=1; D[i]:=0;
while (i<>0) do
begin
if i=n then {обробка вузла-листка}
if test(H, i) then {друкування повного допустимого розміщення}
{ та повернення до батька незалежно від наявності братів}
begin writs(H, n); i:=i-1; {i>0!} D[i]:=1 end
else
if H[i]
else {повернення до батька – }
{піддерево, в якому він є коренем, вже обійшли}
begin i:=i-1; {i>0!} D[i]:=1 end
else {обробка проміжного вузла}
if (D[i]=0) and test(H, i) then {рух у глибину}
begin i:=i+1; H[i]:=1; D[i]:=0 end
else {рух праворуч або нагору}
if H[i]
begin H[i]:=H[i]+1; D[i]:=0 end
else {рух нагору}
begin i:=i-1; if i>0 then D[i]:=1 end
end
Оформлення програми з необхідними означеннями, ініціалізаціями та нерекурсивною процедурою пошуку залишаємо як вправу.
Узагальнимо наведений алгоритм, вважаючи, що, на відміну від задачі про розміщення ферзів, кореневий вузол дерева також містить деяку відповідну інформацію:
заштовхнути кореневий вузол у магазин;
while магазин не порожній do
begin
нехай A – вузол на верхівці магазина;
Перехід до вузла знизу – це повернення до батька, і його умовою в задачі про ферзі є H[i]=n.
Повернення до кореня дерева означає кінець його обходу. Тому використаємо умову i=0 як умову закінчення пошуку. Отже, пошук повних допустимих розміщень ферзів має таке описання, яке по суті є тілом процедури пошуку:
i:=1; H[i]:=1; D[i]:=0;
while (i<>0) do
begin
if i=n then {обробка вузла-листка}
if test(H, i) then {друкування повного допустимого розміщення}
{ та повернення до батька незалежно від наявності братів}
begin writs(H, n); i:=i-1; {i>0!} D[i]:=1 end
else
if H[i]
else {повернення до батька – }
{піддерево, в якому він є коренем, вже обійшли}
begin i:=i-1; {i>0!} D[i]:=1 end
else {обробка проміжного вузла}
if (D[i]=0) and test(H, i) then {рух у глибину}
begin i:=i+1; H[i]:=1; D[i]:=0 end
else {рух праворуч або нагору}
if H[i]
begin H[i]:=H[i]+1; D[i]:=0 end
else {рух нагору}
begin i:=i-1; if i>0 then D[i]:=1 end
end
Оформлення програми з необхідними означеннями, ініціалізаціями та нерекурсивною процедурою пошуку залишаємо як вправу.
Узагальнимо наведений алгоритм, вважаючи, що, на відміну від задачі про розміщення ферзів, кореневий вузол дерева також містить деяку відповідну інформацію:
заштовхнути кореневий вузол у магазин;
while магазин не порожній do
begin
нехай A – вузол на верхівці магазина;
The online video editor trusted by teams to make professional video in
minutes
© Referats, Inc · All rights reserved 2021