You are on page 1of 5

Thut ton Loang

Thut ton Loang thng c ng dng vo vic bin i trng thi Otomat cng
nh cc bi ton tm kim trn th trong trng hp yu cu bi ton l: s
php bin i l t nht.
u im ca n l: rt d ci t v cho li gii ti u. Tuy nhin n li cha ng
mt nhc im rt ln l khi s lng cu hnh lu tr qu ln s gy trn b
nh. Tt nhin cng c nhng cch khc phc nhc im ny nhng chng ta
s bn sau.
tng ca thut ton l ch: t mt trng thi ban u, chng ta s to ln
lt cc trng thi c th c t trng thi cho v cc trng thi c to ra li
to tip cc trng thi khc (chnh v vy thut ton mi c tn l Loang!). Cc
trng thi mi c to ra s c lu vo mt hng i Queue. Nh vy, r rng:
- Nu thc hin n ht chng ta thu c mi trng thi t trng thi ban
u.
- Nu cn bin i n mt trng thi no th nh th t duyt cu hnh theo
kiu "Vo trc ra trc" (First in First out) nh vy m khi dng trng thi th
s lng php bin i l cc tiu.
d hiu ta xt v d sau y:
V d 1: C mt Otomat c ghp t cc chi tit c mt trong hai trng thi 0 hay
1 nh hnh 1. Otomat c cu trc nh hnh 2 gm 8 chi tit G1,...,G8 vi ba li v
A,B,C. Trng thi ca Otomat c th hin bi mt xu nh phn di 8 l cc
trng thi tng ng ca G1,...,G8.

Otomat hot ng nh sau: Khi th mt qu cu vo mt li vo no , sau khi


qu cu i t mt chi tit no , chi tit thay i trng thi t 0 thnh 1 hoc
t 1 thnh 0. Hot ng ca Otomat c th hin bi mt xu k t S ch gm
cc ch ci hoa A,B,C m mi k t trong xu S th hin vic ta th qu cu vo
li vo vi tn k t . V d S=AABC c ngha l ta ln lt th qu cu vo cc
li A,A,B,C.

Bi ton t ra nh sau: Cho hai trng thi bt k T1 v T2 ca Otomat. Hy tm


mt xu k t S ngn nht c th c th hin hot ng ca Otomat chuyn t
trng thi T1 n trng thi T2.
Cc xu T1 v T2 nhp t bn phm v vit xu S ra mn hnh.
Phn tch bi ton: y l bi ton "mu mc" v thut ton Loang.
Mi trng thi l mt xu nh phn di 8 c khai bo:
Type Otomat=String[8]
D thy, s lng trng thi l 28 = 256 khng qu ln cho nn chng ta c th
dng mt hng i Queue 256 phn t cha tng trng thi c to thnh. Ta
khai bo nh sau:
Type QueueType: Array[1..256] of otomat;
Var Queue: QueueType;
Qu trnh loang c thc hin cho n khi xy dng c trng thi ch T2 hoc
hng i rng th dng. Qu trnh ny c qun l bng hai bin First (u) v
Last (cui):
-Bin First tr n v tr trng thi ang xt loang ra cc trng thi mi
-Bin Last tr n v tr trng thi mi nht c to ra trong Queue.
Khi to ban u: First:=1 v Last:=1;
Hm EmptyQueue cho bit hng i c rng khng.
Function EmptyQueue (Queue: QueueType):Boolean;
Begin
Empty:=(First>Last);
End;

Ta li cn thm 2 th tc l: Ly mt trng thi ra khi hng i bin i


(Remove) v np mt trng thi mi vo hng i (A)
(******Lay khoi Queue******)
Procedure Remove(Var CurrentOtomat:Otomat;Queue:QueueType);
Begin
CurrentOtomat:=Q[First]; Inc(First);
End;
(******Nap vao Queue******)
Procedure A(NewOtomat:Otomat;Var Queue:QueueType);
Begin
Inc(Last); Q[Last]:=NewOtomat;
End;
Cng vic quan trng nht l: bin i t mt trng thi bt k T i thnh cc trng
thi c th c, bng cch ta xt 3 kh nng: Th qu cu vo li A, li B, li C. Tc
ng ny ln trng thi Ti to thnh cc trng thi mi Tk,Tk+1,Tk+2.
Tuy nhin cn ch rng: 3 trng thi mi to ny c th c to t trc cho
nn trnh kh nng loang li trng thi c (m iu ny c th dn n thut
ton khng dng!?) ta phi dng mt hm kim tra kim tra Check xem trng
thi va to c trong cc hng i cha: Check=True nu c, bng False
nu ngc li
Function Check(NewOtomat:Otomat):Boolean;
Var j:byte;
Begin
Check:=True;
For j:=Last downto 1 do
If NewOtomat=Queue[j] then exit;
Check:=False;
End;
Khi th tc np mt trng thi mi vo hng i phi l:
If not Check(NewOtomat) then A(NewOtomat,Queue);
Vic bin i chng ta c th t chc thnh 3 hm:
-Function ThaCurrentOtomat:Otomat):Otomat;
-Function ThaB(CurrentOtomat:Otomat):Otomat;
-Function ThaC(CurrentOtomat:Otomat):Otomat;
Gi tr ca hm l trng thi mi c to tng trng thi hin ti
(CurrentOtomat) khi th qu cu vo cc li A,B,C. 3 hm ny tng t nhau, ti
xin trnh by function ThaA cn 2 hm cn li xin mi cc bn t vit.
Function ThaA(CurrentOtomat:Otomat):Otomat;
Var TmpOtomat:Otomat;
Begin
TmpOtomat:=CurrentOtomat;
Case TmpOtomat[1] of
'0': Begin
if TmpOtomat[6]='0' then
TmpOtomat[6]:='1'
Else TmpOtomat[6]:='0';

TmpOtomat[1]:='1';
End;
'1': Begin
Case TmpOtomat[4] of
'0': Begin
if TmpOtomat[6]='0' then TmpOtomat[6]:='1'
Else TmpOtomat[6]:='0';
TmpOtomat[4]:='1';
End;
'1': Begin
if TmpOtomat[7]='0' then
TmpOtomat[7]:='1'
Else TmpOtomat[7]:='0';
TmpOtomat[4]:='0';
End;
End;
TmpOtomat[1]:='0';
End;
End;
ThaA:=TmpOtomat;
End;
Cc th tc cn thit xong!. Mt vn ny sinh l lm th no a ra th
t th cc (m iu ny li l yu cu ca bi ton)?. Gii quyt vn ny rt
n gin!
Chng ta dng thm 2 mng:
-Mng Luu dng lu li vo (A,B,C) cn th t c trng thi .
-Mng Truoc dng tr t trng thi mi to v trng thi to ra n.
Var Luu: Array[1..256] of char;
Truoc: Array[1..256] of byte;
M hnh li gii s n gin nh sau:
Procedure LOANG;
Begin
Found:=True;
While not Empty(Queue) do
Begin
Remove(CurrentOtomat,Queue);
For ch:=A,B,C do
Begin
NewOtomat:=Thch)(CurrentOtomat);
If not Check(NewOtomat) then
Begin
A(NewOtomat,Queue);
Luu:=ch; Truoc[Last]:=First-1;
If NewOtomat=T2 then Exit;
{Gp trng thi ch}
End;
End;
Found:=False;
{Khng tm thy}
End;

Th t cc li th qu cu c th c vit ra bng cch dng thm mt mng


ph hay tt hn c l bng chng trnh quy sau:
Procedure Print_Door(i:byte);
Begin
If i>0 then
Begin
Print_Door(Truoc[i]); Write(Luu[i]);
End;
End;
Thng bo kt qu ln mn hnh nh sau:
If not found then Writeln('Sorry. No solution!')
Else
Begin
Writeln('Oh, We find string S= '); Print_Door(Last);
End;
Nh vy, chng ta hiu v bit cch vn dng thut ton Loang cho cc bi
ton ti u t hp c th. Cn rt nhiu vn lin quan n thut ton nh: x
l cch lu tr, ti u li gii... c l xin hn cc bn vo mt dp khc.
th nghim nhng g chng ta va nghin cu, xin mi cc bn th sc vi bi
tp sau y:
Bi tp:
Mt my gii tr t ng c m ca dng i th. C cc th m s t 1 n N.
Nu ta b th c m s i vo mt ca no th my s thu th v cho ra mt
th c m s no trong khong 1..N. My hnh ng theo thng tin cho trong
file vn bn INFOR.DAT gm:
-Gi tr N v M
-Bng MxN vi ngha: Phn t nm trn dng i, ct j ca bng ny cho bit nu
ta b th c gi tr i vo ca j th s thu c th c s hiu chnh l phn t .
Bi ton t ra:
1. Vi mi th s hiu S (Start) cho trc hy tm cch nhanh nht thu c
th c s hiu ln nht.
2. Vi mi cp th s hiu S v D (Destination) cho trc hy cho bit cch
no nhanh nht dng th S thu c th D hay khng.
Li gii hin ln mn hnh theo dng: B th S v ca T thu c th Z.

You might also like