You are on page 1of 46

Chng 6 e quy

Giao trnh Cau truc d lieu va Giai thuat 91


Chng 6 OK QY

Chuong nay frnh bay vo do quy |rccursion) mof phuong phap ma frong do
do gIaI mof baI foan, nguoI fa gIaI cac fruong hop nho hon cua no. Chung fa can
fm hIou mof vaI ung dung va chuong frnh mau do fhay duoc mof so frong raf
nhIou dang baI foan ma vIoc su dung do quy do gIaI raf co IoI. Mof so v du don
gIan, mof so khac fhuc su phuc fap. Chung fa cung so phan fch xom do quy
fhuong duoc hIon fhuc frong may fnh nhu fho nao, khI nao non dung do quy va
khI nao non franh.
6.1. Go theu ve de quy
6.1.1. Co cuu ngun xep cho cuc lun go hum
KhI mof ham goI mof ham khac, fh faf ca cac frang fhaI ma ham goI dang co
can duoc khoI phuc IaI sau khI ham duoc goI kof fhuc, do ham nay fIop fuc fhuc
hIon cong vIoc do dang cua mnh. Trang fhaI do gom co: dIom quay vo |dong Ionh
ko sau Ionh goI ham); cac frj frong cac fhanh ghI, v cac fhanh ghI frong bo xu Iy
so duoc ham duoc goI su dung don; cac frj frong cac bIon cuc bo va cac fham frj
cua no. Nhu vay moI ham can co mof vung nho danh rIong cho no. Vung nho nay
phaI duoc fon faI frong suof fhoI gIan ko fu khI ham fhuc hIon cho don khI no kof
fhuc cong vIoc.

CIa su chung fa co ba ham A, , C, ma A goI , goI C. so khong kof fhuc
fruoc khI C kof fhuc. Tuong fu, A khoI su cong vIoc dau fIon nhung IaI kof fhuc
cuoI cung. Su dIon fIon cua cac hoaf dong cua cac ham xay ra fhoo fnh chaf vao
sau ra fruoc |Last In First Out LIFO. Nou xof don nhIom vu cua may fnh frong
vIoc fo chuc cac vung nho fam danh cho cac ham nay su dung, chung fa fhay rang
cac vung nho nay cung phaI nam frong mof danh sach co cung fnh chaf fron, co
nghIa Ia ngan xop. V fho, ngan xop dong mof vaI fro chu chof IIon quan don cac
ham frong ho fhong may fnh. Trong hnh 6.1, M bIou dIon chuong frnh chnh,
A, , C Ia cac ham fron.

HInh 6.1- Co cau ngan xop cho cac Ian goI ham
Chng 6 e quy
Giao trnh Cau truc d lieu va Giai thuat 92
Hnh 6.1 bIou dIon mof day cac vung nho fam cho cac ham, moI cof Ia hnh
anh cua ngan xop faI mof fhoI dIom, cac fhay doI cua ngan xop co fho duoc nhn
fhay bang cach doc fu fraI sang phaI. Hnh anh nay cung cho chung fa fhay rang
khong co su khac nhau frong cach dua mof vung nho fam vao ngan xop gIua haI
fruong hop: mof ham goI mof ham khac va mof ham goI chnh no. Oe quy Ia fon
goI fruong hop mof ham goI chnh no, hay fruong hop cac ham Ian Iuof goI nhau
ma frong do co mof ham goI fro IaI ham dau fIon. Thoo cach nhn cua co cau ngan
xop, su goI ham do quy khong co g khac voI su goI ham khong do quy.

6.1.2. Cuy beu den cuc lun go hum
So do cay |trcc Jiagram) co fho Iam ro hon moI IIon quan gIua ngan xop va
vIoc goI ham. So do cay hnh 6.2 fuong duong voI co cau ngan xop o hnh 6.1.

Chung fa baf dau fu goc cua cay, fuong ung voI chuong frnh chnh. |Cac fhuaf
ngu dung cho cac fhanh phan cua cay co fho fham khao frong chuong 9) MoI vong
fron goI Ia nuf cua cay, fuong ung voI mof Ian goI ham. Cac nuf ngay duoI goc cay
bIou dIon cac ham duoc goI fruc fIop fu chuong frnh chnh. MoI ham frong so
fron co fho goI ham khac, cac ham nay IaI duoc bIou dIon boI cac nuf o sau hon.
ang cach nay cay so Ion Ion nhu hnh 6.2 va chung fa goI cay nay Ia cay bIou
dIon cac Ian goI ham.

o fhoo vof cac Ian goI ham, chung fa baf dau fu goc cua cay va dI chuyon qua
hof cay fhoo muI fon frong hnh 6.2. Cach dI nay duoc goI Ia phep duyet cuy
|traocrsa/). KhI dI xuong va gap mof nuf, do Ia Iuc goI ham. Sau khI duyof qua hof
phan cay bon duoI, chung fa gap fro IaI nuf nay, do Ia Iuc kof fhuc ham duoc goI.
Cac nuf Ia bIou dIon cac ham khong goI mof ham nao khac.


HInh 6.2- Cay bIou dIon cac Ian goI ham.
Chng 6 e quy
Giao trnh Cau truc d lieu va Giai thuat 93
Chung fa dac bIof chu y don do quy, do do fhong fhuong chung fa chI vo mof
phan cua cay bIou dIon su goI do quy, va chung fa goI Ia cuy de quy |rccursion
trcc). Trong so do cay chung fa cung Iuu y mof dIou Ia khong co su khac nhau gIua
cach goI do quy voI cach goI ham khac. Su do quy don gIan chI Ia su xuaf hIon cua
cac nuf khac nhau frong cay co quan ho nuf fruoc nuf sau voI nhau ma co cung
fon. Iom fhu haI can Iuu y rang, chnh v cay bIou dIon cuc lun go hum, non
frong chuong frnh, nou mof Ionh goI ham chI xuaf hIon mof Ian nhung IaI nam
frong vong Iap, fh nuf bIou dIon ham so xuut hen nheu lun frong cay, moI
Ian fuong ung mof Ian goI ham. Tuong fu, nou Ionh goI ham nam frong phan ro
nhanh cua mof dIou kIon ma dIou kIon nay khong xay ra fh nuf bIou dIon ham so
khong xuut hen frong cay.

Co cau ngan xop o hnh 6.1 cho fhay nhu cau vo vung nho cua do quy. Nou mof
ham goI do quy chnh no vaI Ian fh ban sao cua cac bIon khaI bao frong ham
duoc fao ra cho moI Ian goI do quy. Trong cach hIon fhuc fhong fhuong cua do
quy, chung duoc gIu frong ngan xop. Chu y rang tong dung luong vung nho
can cho ngan xop nay t le vo cheu cuo cua cay do quy chu khong phu thuoc
vuo tong so nut frong cay. Iou nay co nghIa rang, fong dung Iuong vung nho
can fhIof do hIon fhuc mof ham do quy phu fhuoc vao do sau cua do quy, khong
phu fhuoc vao so Ian ma ham duoc goI.

HaI hnh anh fron cho chung fa fhay moI IIon quan maf fhIof gIua mof bIou
dIon cay va ngan xop:

Trong qua trnb Juyct qua bat ky mot cay nao, cac nut Juoc tbcm oao bay /ay
Ji Jung tbco kicu cua ngan xcp. Trai /ai, cbo truoc mot ngan xcp, co tbc oc mot
cay Jc mo ta qua trnb tbay Joi cua ngan xcp.

Chung fa hay fm hIou mof vaI v du don gIan vo do quy. Sau do chung fa so
xom xof do quy fhuong duoc hIon fhuc frong may fnh nhu fho nao.

6.1.3. Gu thuu: Mot d{nh nghIu de quy
Trong foan hoc. gIaI fhua cua mof so nguyon fhuong duoc djnh nghIa boI cong
fhuc:
n! = n x |n-1) x ... x 1.
Hoac djnh nghIa sau:


CIa su chung fa can fnh 4!. Thoo djnh nghIa chung fa co:


1 nou n=0
n x |n-1)! nou n>0.
n! =
Chng 6 e quy
Giao trnh Cau truc d lieu va Giai thuat 94
4! = 4 x 3!
= 4 x |3 x 2!)
= 4 x |3 x |2 x 1!))
= 4 x |3 x |2 x |1 x 0!)))
= 4 x |3 x |2 x |1 x 1)))
= 4 x |3 x |2 x 1))
= 4 x |3 x 2)
= 4 x 6
= 24

VIoc fnh foan fron mInh hoa ban chaf cua cach ma do quy fhuc hIon. o co
duoc cau fra IoI cho mof baI foan Ion, phuong phap chung Ia gIam baI foan Ion
fhanh mof hoac nhIou baI foan con co ban chaf fuong fu ma kch fhuoc nho hon.
Sau do cung chInh phuong phup chung nuy IaI duoc su dung cho nhung baI
foan con, cu nhu fho do quy so fIop fuc cho don khI kch fhuoc cua baI foan con da
gIam don mof kch fhuoc nho nhaf nao do cua mof vaI fruong hop co ban, ma IoI
gIaI cua chung co fho co duoc mof cach fruc fIop khong can don do quy nua. NoI
cach khac:

MoI qua frnh do quy gom co haI phan:

Mof vaI fruong hop co ban nho nhaf co fho duoc gIaI quyof ma khong can do
quy.
Mof phuong phap chung co fho gIam mof fruong hop fhanh mof hoac nhIou
fruong hop nho hon, va nho do vIoc gIam nho van do co fho fIon frIon cho
don kof qua cuoI cung Ia cac fruong hop co ban.

C++, cung nhu cac ngon ngu may fnh hIon daI khac, cho phop do quy do dang.
VIoc fnh gIaI fhua frong C++ fro fhanh mof ham sau day.


i nt factorial( i nt n)
/ *
pre: n Ia mof so khong am.
post: fra vo frj cua n gIaI fhua.
*/
{
i f ( n == 0)
r et ur n 1;
el se
r et ur n n * f act or i al ( n - 1) ;
}

Chng 6 e quy
Giao trnh Cau truc d lieu va Giai thuat 95
Nhu chung fa fhay, djnh nghIa do quy va IoI gIaI do quy cua mof baI foan dou
co fho raf ngan gon va dop do. Tuy nhIon vIoc fnh foan chI fIof co fho doI hoI
phaI gIu IaI raf nhIou phop fnh fung phan fruoc khI co duoc kof qua day du.

May fnh co fho do dang nho cac fnh foan fung phan bang mof ngan xop. Con
nguoI fh kho Iam duoc nhu vay, con nguoI kho co fho nho mof day daI cac kof
qua fnh foan fung phan do roI sau do quay IaI hoan faf chung. o do, khI su
dung do quy, cach chung fa suy nghI co khac voI cac cach Iap frnh khac. Chung
fa phaI xom xof van do bang mof cach nhn fong fho va danh nhung vIoc fnh
foan chI fIof IaI cho may fnh.

Chung fa phaI dac fa frong gIaI fhuaf cua chung fa mof cach chnh xac cac
buoc fong quaf cua vIoc gIam mof baI foan Ion fhanh nhIou fruong hop nho hon;
chung fa phaI xac djnh dIou kIon dung |cac fruong hop nho nhaf) va cach gIaI cua
chung. NgoaI fru mof so f v du nho va don gIan, chung fa khong non co gang
hIou gIaI fhuaf do quy bang cach bIon doI fu baI foan ban dau cho don fan buoc
kof fhuc, hoac Ian fhoo vof cua cac cong vIoc ma may fnh so Iam. Iam nhu fho,
chung fa so nhanh chong Ian Ion boI cac cong vIoc bj fr hoan IaI va chung fa so
bj maf phuong huong.

6.1.4. Chu de tr{: Bu toun Thup Hu No
6.1.4.1. Bu toun
Vao fho ky fhu 19 o chau Au xuaf hIon mof fro choI duoc goI Ia Thap Ha NoI.
NguoI fa ko rang fro choI nay bIou dIon mof nhIom vu o mof ngoI don cua An o
gIao. Vao caI ngay ma fho gIoI moI duoc fao non, cac vj IInh muc duoc gIao cho 3
caI fhap bang kIm cuong, faI fhap fhu nhaf co do 64 caI dIa bang vang. Cac IInh
muc nay phaI dI chuyon cac dIa fu fhap fhu nhaf sang fhap fhu ba sao cho moI
Ian chI dI chuyon 1 dIa va khong co dIa Ion nam fron dIa nho. NguoI fa bao rang
khI cong vIoc hoan faf fh don ngay fan fho.


HInh 6.3- aI foan fhap Ha noI
Chng 6 e quy
Giao trnh Cau truc d lieu va Giai thuat 96
NhIom vu cua chung fa Ia vIof mof chuong frnh In ra cac buoc dI chuyon cac
dIa gIup cho cac nha IInh muc, chung fa goI dong Ionh sau

move( 64, 1, 3, 2)

co nghIa Ia: chuyon 64 dIa fu fhap fhu nhaf sang fhap fhu ba, su dung fhap fhu
haI Iam noI do fam.
6.1.4.2. Lo gu
Y fuong do don voI IoI gIaI o day Ia, su fap frung chu y cua chung fa khong
phaI Ia vao buoc dau fIon dI chuyon caI dIa fron cung, ma Ia vao buoc kho nhaf: dI
chuyon caI dIa duoI cung. Ia Ion nhaf duoI cung nay so phaI co vj fr o duoI cung
faI fhap fhu ba fhoo you cau baI foan. Khong co cach nao khac do cham duoc don
dIa cuoI cung fruoc khI 63 dIa nam fron da duoc chuyon dI. ong fhoI 63 dIa nay
phaI duoc daf faI fhap fhu haI do fhap fhu ba frong.

Chung fa da co duoc mof buoc nho do fIon don IoI gIaI, day Ia mof buoc raf nho v
chung fa con phaI fm cach dI chuyon 63 dIa. Tuy nhIon day IaI Ia mof buoc raf
quan frong, v vIoc dI chuyon 63 dIa da co cung ban chaf voI baI foan ban dau, v
khong co Iy do g ngan can vIoc chung fa dI chuyon 63 dIa nay fhoo cung mof
cach fuong fu.

move( 63, 1, 2, 3) ; / / Chuyon 63 dIa fu fhap 1 sang fhap 2 |fhap 3 dung Iam noI do fam).
cout << " Chuyen dIu thu 64 tu thup 1 sung thup 3." << endl ;
move( 63, 2, 3, 1) ; / / Chuyon 63 dIa fu fhap 2 sang fhap 3 |fhap 1 dung Iam noI do fam).

Cach suy nghI nhu fron chnh Ia y fuong cua do quy. Chung fa da mo fa cac
buoc chu chof duoc fhuc hIon nhu fho nao, va cac cong vIoc con IaI cua baI foan
cung so duoc fhuc hIon mof cach fuong fu. ay cung Ia y fuong cua vIoc chIa do
frj: do gIaI quyof mof baI foan, chung fa chIa cong vIoc ra fhanh nhIou phan nho
hon, moI phan IaI duoc chIa nho hon nua, cho don khI vIoc gIaI chung fro non do
dang hon baI foan ban dau raf nhIou.
6.1.4.3. Tnh che
o vIof duoc gIaI fhuaf, chung fa can bIof faI moI buoc, fhap nao duoc dung do
chua fam cac dIa. Chung fa co dac fa sau day cho ham:

void move(int count, int start, int finish, int temp);
pre: Co f nhaf Ia count dIa faI fhap start. Ia fron cung cua fhap temp va fhap finish Io n
hon baf ky dIa nao frong count dIa fron cung faI fhap start.
post: count dIa fron cung faI fhap start da duoc chuyon sang fhap finish; fhap temp duoc
dung Iam noI do fam so fro IaI frang fhaI ban dau.

Chng 6 e quy
Giao trnh Cau truc d lieu va Giai thuat 97
CIa su rang baI foan cua chung fa so dung sau mof so buoc huu han |mac dau
do co fho Ia ngay fan fho!), va nhu vay phaI co cach nao do do vIoc do quy dung
IaI. Mof dIou kIon dung hIon nhIon Ia khI khong con dIa can dI chuyon nua.
Chung fa co fho vIof chuong frnh sau:

const i nt di sks = 64; / / Can sua hang so nay fhaf nho do chay fhu chuong frnh.

voi d move( i nt count , i nt st ar t , i nt f i ni sh, i nt t emp) ;
/ *
pre: Khong co.
post: Chuong frnh mo phong baI foan Thap Ha NoI kof fhuc.
*/
main( )
{
move( di sks, 1, 3, 2) ;
}
Ham do quy nhu sau:

void move(int count, int start, int finish, int temp)
{
i f ( count > 0) {
move( count - 1, st ar t , t emp, f i ni sh) ;
cout << " Move di sk " << count << " f r om" << st ar t
<< " t o " << f i ni sh << " . " << endl ;
move( count - 1, t emp, f i ni sh, st ar t ) ;
}
}

6.1.4.4. Theo vet cuu chuong trInh
Cong cu huu ch cua chung fa frong vIoc fm hIou mof ham do quy Ia hnh anh
fho hIon cac buoc fhuc hIon cua no fron mof v du fhaf nho. Cac Ian goI ham
frong hnh 6.4 Ia cho fruong hop so dIa bang 2. MoI khoI frong so do bIou dIon
nhung g dIon ra frong mof Ian goI ham. Ian goI ngoaI cung move( 2, 1, 3, 2) |do
chuong frnh chnh goI) co ba dong Ionh sau:

move( 1, 1, 2, 3) ; / / Chuyon 1 dIa fu fhap 1 sang fhap 2 |fhap 3 dung Iam noI do fam).
cout << " Chuyen dIu thu 2 tu thup 1 sung thup 3. " << endl ;
move( 1, 2, 3, 1) ; / / Chuyon 1 dIa fu fhap 2 sang fhap 3 |fhap 1 dung Iam noI do fam).

Chng 6 e quy
Giao trnh Cau truc d lieu va Giai thuat 98

ong Ionh fhu nhaf va dong Ionh fhu ba goI do quy. ong Ionh move(1,1,2,3)
baf dau goI ham move fhuc hIon fro IaI dong Ionh dau fIon, nhung voI cac fhong
so moI. ong Ionh nay so fhuc hIon dung ba Ionh sau:

move( 0, 1, 3, 2) ; / / Chuyon 0 dIa |goI do quy Ian nua, bIou dIon boI khoI nho bon
/ / frong).
couf << "Chuyen dIu 1 tu thup 1 sung thup 2" << ondI;

move( 0, 3, 2, 1) ; / / Chuyon 0 dIa |goI do quy Ian nua, bIou dIon boI khoI nho bon
/ / frong).

Sau khI khoI bIou dIon Ian goI do quy nay kof fhuc, dong Ionh hIon fhj
"Chuyen dIu thu 2 tu thup 1 sung thup 3" fhuc hIon. Sau do Ia khoI bIou dIon
Ian goI do quy move(1,2,3,1).

Chung fa fhay rang haI Ian goI do quy bon frong khoI move(1,1,2,3) co so
dIa Ia 0 non khong phaI fhuc hIon dIou g, hnh bIou dIon Ia mof khoI rong. CIua
haI Ian nay Ia hIou fhj "Chuyen dIu 1 tu thup 1 sung thup 2." Tuong fu cho
cac dong Ionh bon frong move(1,2,3,1), chung fa hIou duoc cach ma do quy
hIon fhuc.

Hnh 6.4- Theo vet cua chng trnh Thap Ha Noi vi so a la 2.
Chng 6 e quy
Giao trnh Cau truc d lieu va Giai thuat 99
Chung fa so xom xof fhom mof cong cu khac co fnh hIon fhj cao hon frong
vIoc bIou dIon su do quy bang cach Ian fhoo vof cua chuong frnh vua roI.
6.1.4.5. Phun tIch
Hnh 6.5 Ia cay do quy cho baI foan Thap Ha NoI voI 3 dIa.
Iuu y rang chuong frnh cua chung fa cho baI foan Thap Ha NoI khong chI
sInh ra mof IoI gIaI day du cho baI foan ma con sInh ra mof IoI gIaI fof nhaf co
fho co, va day cung Ia IoI gIaI duy nhaf duoc fm fhay fru khI chung fa chap nhan
IoI gIaI voI mof day daI Io fho cac buoc du fhua va baf IoI nhu sau:

Chuyon dIa 1 fu fhap 1 sang fhap 2.
Chuyon dIa 1 fu fhap 2 sang fhap 3.
Chuyon dIa 1 fu fhap 3 sang fhap 1. . . .

o chung mInh fnh duy nhaf cua mof IoI gIaI khong fho gIan Iuoc hon duoc
nua, chung fa chu y rang, faI moI buoc, nhIom vu can Iam duoc fong kof IaI Ia can
dI chuyon mof so dIa nhaf djnh nao do fu mof fhap nay sang mof fhap khac.
Khong co cach nao khac ngoaI cach Ia fruoc hof phu d chuyen toun bo so dIu
ben tren, fru dIa cuoI cung nam duoI, sau do co fho fhuc hIon mof so buoc du
fhua nao do, fIop fhoo Ia d chuyen chInh dIu cuo cung, roI IaI co fho fhuc
hIon mof so buoc du fhua nao do, do cuoI cung Ia d chuyen toun bo so dIu cu
ve lu tren dIu duo cung nuy. Nhu vay, nou IoaI dI faf ca cac vIoc Iam du fhua
fh nhung vIoc con IaI chnh Ia cof IoI cua gIaI fhuaf do quy cua chung fa.

TIop fhoo, chung fa so fnh xom do quy duoc goI IIon fIop bao nhIou Ian fruoc
khI co su quay vo. Ian dau do quy co count =64, moI Ian do quy count duoc gIa m
dI 1. Vay nou chung fa goI do quy voI count = 0, Ian do quy nay khong fhuc
hIon g, chung fa co fong do sau cua do quy Ia 64. Iou nay co nghIa rang, nou
chung fa vo cay do quy cho chuong frnh, fh cay so co 64 muc khong ko muc cua

HInh 6.5- Cay do quy cho fruong hop 3 dIa
Chng 6 e quy
Giao trnh Cau truc d lieu va Giai thuat 100
cac muc Ia. NgoaI fru cac nuf Ia, cac nuf khac dou goI do quy haI Ian frong moI
nuf, nhu vay fong so nuf faI moI muc chnh xac bang haI Ian fong so nuf o muc
cao hon.

Tu cach suy nghI fron vo cay do quy |ngay ca khI cay qua Ion khong fho vo
duoc), chung fa co fho do dang fnh ra so Ian dI chuyon can Iam |moI Ian dI
chuyon mof dIa) do dI chuyon hof 64 dIa fhoo you cau baI foan. MoI nuf frong cay
so In mof IoI huong dan fuong ung mof Ian chuyon mof dIa, fru cac nuf Ia. Tong
so nuf goc va nuf frung gIan Ia:

1 +2 +4 +. . . +2
63
= 2
0
+2
1
+2
2
+. . . +2
63
= 2
64
- 1.

non so Ian dI chuyon dIa can fhuc hIon faf ca Ia 2
64
1. Chung fa co fho uoc
chung con so nay Ion nhu fho nao bang cach so sanh voI

10
3
= 1000 1024 = 2
10
,

fa co fong so Ian dI chuyon dIa bang 2
64
=2
4
x 2
60
2
4
x 10
18
=1. 6 x10
19


MoI nam co khoang 3. 2 x 10
7
gIay. CIa su moI Ian dI chuyon mof dIa duoc fhuc
hIon maf 1 gIay, fh foan bo cong vIoc cua cac IInh muc so phaI fhuc hIon maf 5
x 10
11
nam. Cac nha fhIon van hoc uoc doan fuoI fho cua vu fru so nho hon 20 fI
nam, nhu vay, fhoo fruyon fhuyof cua baI foa n nay fh fho gIoI con koo daI hon ca
vIoc fnh foan do don 25 Ian!

Khong co mof may fnh nao co fho chay duoc chuong frnh Thap Ha NoI, do
khong du fhoI gIan, nhung ro rang khong phaI Ia do van do khong gIan. Khong
gIan o day chI doI hoI 64 Ian goI do quy.
6.2. Cuc nguyen tuc cuu de quy
6.2.1. Thet ke gu thuut de quy
o quy Ia mof cong cu cho phop nguoI Iap frnh fap frung vao buoc chnh you
cua gIaI fhuaf ma khong phaI Io Iang faI fhoI dIom khoI dau vo cach kof noI buoc
chnh you nay voI cac buoc khac. KhI can gIaI quyof mof van do, buoc fIop can
dau fIon non Iam fhuong Ia xom xof mof vaI v du don gIan, va chI sau khI da
hIou duoc chung mof cach ky Iuong, chung fa moI fhu co gang xay dung mof
phuong phap fong quaf hon. Mof vaI dIom quan frong frong vIoc fhIof ko mof gIaI
fhuaf do quy duoc IIof ko sau day:

TIm buoc chInh yeu. Hay baf dau bang cau hoI Bai toan nay co tbc Juoc cbia
nbo nbu tbc nao: hoac Buoc cbinb ycu trong giai Joan giua sc Juoc tbuc bicn
Chng 6 e quy
Giao trnh Cau truc d lieu va Giai thuat 101
nbu tbc nao:. Non dam bao rang cau fra IoI cua ban don gIan nhung co fnh fong
quaf. Khong non dI fu dIom khoI dau hay dIom kof fhuc cua baI foan Ion, hoac sa
vao qua nhIou fruong hop dac bIof |do chung chI phu hop voI cac baI foan nho).
KhI da co duoc mof buoc nho va don gIan do huong foI IoI gIaI, hay fu hoI rang
nhung khuc mac con IaI cua baI foan co fho duoc gIaI quyof bang cach fuong fu
hay khong, do sua IaI phuong phap cua ban cho fong quaf hon, nou can fhIof.
NgoaI fru nhung djnh nghIa foan hoc fho hIon su do quy qua ro rang, mof dIou
fhu vj ma chung fa so Ian Iuof gap frong nhung chuong sau Ia, khI nhung baI foan
can duoc gIaI quyof fron nhung cau fruc du IIou ma djnh nghIa mang fnh chaf do
quy nhu danh sach, chuoI ky fu bIou dIou bIou fhuc so hoc, cay, hay do fhj, fh
gIaI phap huong foI mof gIaI fhuaf do quy Ia raf do nhn fhay.

TIm deu ken dung. Iou kIon dung chI ra rang baI foan hoac mof phan nao
do cua baI foan da duoc gIaI quyof. Iou kIon dung fhuong Ia fruong hop nho, dac
bIof, co fho duoc gIaI quyof mof cach do dang khong can do quy.

Phuc thuo gu thuut. Kof hop dIou kIon dung voI buoc chnh you cua baI foan,
su dung Ionh I do chon Iua gIua chung. on day fh chung fa co fho vIof ham do
quy, frong do mo fa cach ma buoc chnh you duoc fIon hanh cho don khI gap duoc
dIou kIon dung. MoI Ian goI do quy hoac Ia phaI gIaI quyof mof phan cua baI foan
khI gap mof frong cac dIou kIon dung, hoac Ia phaI gIam kch fhuoc baI foan
huong dan don dIou kIon dung.

Kem tru su ket thuc. Ko fIop, va cung Ia dIou foI quan frong, Ia phaI chac chan
vIoc goI do quy so khong bj Iap vo fan. af dau fu mof fruong hop chung, qua mof
so buoc huu han, chung fa can kIom fra IIou dIou kIon dung co kha nang xay ra do
qua frnh do quy kof fhuc hay khong. Trong baf ky mof gIaI fhuaf nao, khI mof
Ian goI ham khong phaI Iam g, no fhuong quay vo mof cach om fham. oI voI
gIaI fhuaf do quy, dIou nay raf fhuong xay ra, do vIoc goI ham ma khong phaI Iam
g fhuong Ia mof dIou kIon dung. o do, can Iuu y rang vIoc goI ham ma khong
Iam g fhuong khong phaI Ia mof IoI frong fruong hop cua ham do quy.

Kem tru lu mo truong hop duc bet
CuoI cung chung fa cung can bao dam rang gIaI fhuaf cua chung fa Iuon dap ung
moI fruong hop dac bIof.

Ve cuy de quy. Cong cu chnh do phan fch cac gIaI fhuaf do quy Ia cay do quy.
Nhu chung fa da fhay frong baI foan Thap Ha NoI, chIou cao cua cay do quy IIon
quan maf fhIof don fong dung Iuong bo nho ma chuong frnh can don, va kch
fhuoc fong cong cua cay phan anh so Ian fhuc hIon buoc chnh you va cung Ia
fong fhoI gIan chay chuong frnh. Thong fhuong chung fa non vo cay do quy cho
Chng 6 e quy
Giao trnh Cau truc d lieu va Giai thuat 102
mof hoac haI fruong hop don gIan cua baI foan cua chung fa v no so chI dan cho
chung fa nhIou dIou.
6.2.2. Cuch thuc hen cuu de quy
Cau hoI vo cach hIon fhuc cua mof chuong frnh do quy frong may fnh can
duoc fach roI khoI cau hoI vo su dung do quy do fhIof ko gIaI fhuaf.

Trong gIaI doan fhIof ko, chung fa non su dung moI phuong phap gIaI quyof van
do ma chung fo ra fhch hop voI baI foan, do quy Ia mof frong cac cong cu hIou
qua va IInh hoaf nay.

Trong gIaI doan hIon fhuc, chung fa can fm xom phuong phap nao frong so cac
phuong phap so Ia fof nhaf so voI fung fnh huong.

Co f nhaf haI cach do hIon fhuc do quy frong ho fhong may fnh. Quan dIom
chnh cua chung fa khI xom xof haI cach hIon fhuc khac nhau duoI day Ia, cho du
co su han cho vo khong gIan va fhoI gIan, chung cung non duoc fach rIong ra khoI
qua frnh fhIof ko gIaI fhuaf. Cac IoaI fhIof bj fnh foan khac nhau frong fuong
IaI co fho dan don nhung kha nang va nhung han cho khac nhau. Chung fa so fm
hIou haI cach hIon fhuc da xu Iy va don xu Iy cua do quy duoI day.
6.2.2.1. Hen thuc du xu ly: su dong tho
Co Io rang cach suy nghI fu nhIon vo qua frnh hIon fhuc cua do quy Ia cac
ham khong chIom nhung phan rIong frong cung mof may fnh, ma chung so duoc
fhuc hIon fron nhung may khac nhau. ang cach nay, khI mof ham can goI mof
ham khac, no khoI dong chIoc may fuong ung, va khI may nay kof fhuc cong vIoc,
no so fra vo chIoc may ban dau kof qua fnh duoc do chIoc may ban dau co fho
fIop fuc cong vIoc. Nou mof ham goI do quy chnh no haI Ian, don gIan no chI can
khoI dong haI chIoc may khac do fhuc hIon cung nhung dong Ionh y nhu nhung
dong Ionh ma no dang fhuc hIon. KhI haI may nay hoan faf cong vIoc chung fra
kof qua vo cho may goI chung. Nou chung can goI do quy, dI nhIon chung cung
khoI dong nhung chIoc may khac nua.

Thong fhuong bo xu Iy frung uong Ia fhanh phan daf nhaf frong ho fhong may
fnh, non baf ky mof y nghI nao vo mof ho fhong co nhIou hon mof bo xu Iy cung
can phaI xom xof don su Iang ph. Nhung raf co fho frong fuong IaI chung fa so
fhay nhung ho fhong may fnh Ion chua hang fram, nou khong Ia hang ngan, cac
bo vI xu Iy fuong fu frong cac fhanh phan cua no. KhI do fh vIoc fhuc hIon do
quy bang nhIou bo xu Iy song song so fro non bnh fhuong.

VoI da xu Iy, nhung nguoI Iap frnh so khong con xom xof cac gIaI fhuaf chI
nhu mof chuoI fuyon fnh cac hanh dong, fhay vao do, can phaI nhan ra mof so
phan cua gIaI fhuaf co fho fhuc hIon song song. Cach xu Iy nay con duoc goI Ia xu
Chng 6 e quy
Giao trnh Cau truc d lieu va Giai thuat 103
Iy dong fhoI |concurrcnt). VIoc nghIon cuu vo xu Iy dong fhoI va cac phuong phap
kof noI gIua chung hIon faI Ia mof do faI nghIon cuu frong khoa hoc may fnh,
mof dIou chac chan Ia no so caI fIon cach ma cac gIaI fhuaf so duoc mo fa va hIon
fhuc frong nhIou nam foI.
6.2.2.2. Hen thuc don xu ly: vun de vung nho
o xom xof Iam cach nao ma do quy co fho duoc fhuc hIon frong mof ho fhong
chI co mof bo xu Iy, chung fa nho IaI co cau ngan xop cua cac Ian goI ham da duoc
gIoI fhIou o dau chuong nay. Mof ham khI duoc goI can phaI co mot vung nho
reng do chua cac bIon cuc bo va cac fham frj cua no, ko ca cac frj frong cac
fhanh ghI va dja chI quay vo khI no chuan bj goI mof ham khac. Sau khI ham kof
fhuc, no so khong con can don baf cu fhu g frong vung nho danh rIong cho no
nua. Thuc su lu khong co su khuc nhuu guu vec go mot hum de quy vu
vec go mot hum khong de quy. KhI mof ham chua kof fhuc, vung nho cua no
Ia baf kha xam pham. Mof Ian goI ham do quy cung Ia mof Ian goI ham rIong
bIof. Chung fa can chu y rang haI Ian goI do quy Ia hoan foan khac nhau, do
chung tu khong tron lun vung nho cuu chung kh chung chuu ket thuc.
oI voI nhung ham do quy, nhung fhong fIn Iuu fru danh cho Ian goI ngoaI can
duoc gIu cho don khI no kof fhuc, nhu vay mof Ian goI bon frong phaI su dung
mof vung khac Iam vung nho cua rIong no.

oI voI mof ham khong do quy, vung nho co fho Ia mof vung co djnh va duoc
danh cho Iau daI, do chung fa bIof rang mof Ian goI ham so duoc fra vo fruoc khI
ham co fho IaI duoc goI Ian nua, va sau khI Ian goI fruoc duoc fra vo, cac fhong
fIn frong vung nho cua no khong con can fhIof nua. Vung nho Iau daI duoc danh
san cho cac ham khong do quy co fho gay Iang ph raf Ion, do nhung khI ham
khong duoc you cau fhuc hIon, vung nho do khong fho duoc su dung vao muc dch
khac. o cung Ia cach quan Iy vung nho danh cho cac ham cua cac phIon ban cu
cua cac ngon ngu nhu FORTRAN va COBOL, va chnh dIou nay cung Ia Iy do ma cac
ngon ngu nay khong cho phop do quy.
6.2.2.3. Nhu cuu ve tho gun vu khong gun cuu mot quu trInh de quy
Chung fa hay xom IaI cay bIou dIon cac Ian goI ham: frong qua frnh duyof
cay, cac nuf duoc fhom vao hay Iay dI dung fhoo kIou cua ngan xop. Qua frnh
nay duoc mInh hoa frong hnh 6.1.
Tu hnh nay, chung fa co fho kof Iuan ngay rang fong dung Iuong vung nho
can do hIon fhuc do quy fI Io fhuan voI chIou cao cua cay do quy. Nhung nguoI Iap
frnh khong fm hIou ky vo do quy fhInh fhoang van nham Ian rang khong gIan
can phaI co IIon quan don fong so nuf frong cay. ThoI gIan chay chuong frnh IIon
quan don so Ian goI ham, do Ia fong so nuf frong cay; nhung dung Iuong vung nho
faI mof fhoI dIom chI Ia fong cac vung nho danh cho cac nuf nam fron duong dI
fu nuf fuong ung voI ham dang fhuc fhI nguoc vo goc cua cay. Khong gIan can
Chng 6 e quy
Giao trnh Cau truc d lieu va Giai thuat 104
fhIof duoc phan anh boI chIou cao cua cay. Mof cay do quy co nhIou nuf nhung
khong cao fho hIon mof qua frnh do quy ma no fhuc hIon duoc raf nhIou cong
vIoc fron mof vung nho khong Ion.

6.2.3. Oe quy duo
Chung fa hay xof don fruong hop hanh dong cuoI cung frong mof ham Ia vIoc
goI do quy chnh no. Hay xom xof ngan xop danh cho qua frnh do quy, nhu chung
fa fhay, cac fhong fIn can do khoI phuc IaI frang fhaI cho Ian do quy ngoaI so
duoc Iuu IaI ngay fruoc khI Ian do quy frong duoc goI. Tuy nhIon khI Ian do quy
frong fhuc hIon xong fh Ian do quy ngoaI cung khong con vIoc g phaI Iam nua,
do vIoc goI do quy Ia hanh dong cuoI cung cua ham non day cung Ia Iuc ma ham
do quy ngoaI kof fhuc. Va nhu vay vIoc Iuu IaI nhung fhong fIn dung do khoI phuc
frang fhaI cu cua Ian do quy ngoaI fro non hoan foan vo ch. MoI vIoc can Iam o
day chI Ia gan cac frj can fhIof cho cac bIon va quay ngay fro vo dau ham, cac
bIon duoc gan frj y nhu Ia chnh ham do quy bon frong nhan duoc qua danh sach
fhong so vay. Chung fa fong kof nguyon fac nay nhu sau:

Ncu Jong /cnb se c chay cuoi cung trong mot bam /a goi Jc quy cbinb
no, tb oicc goi Jc quy nay co tbc Juoc /oai bo bang cacb gan /ai cac tbong so goi
tbco cac gia trj nbu /a Jc quy oan Juoc goi, oa sau Jo /ap /ai toan bo bam.


HInh 6.6 o quy duoI
Chng 6 e quy
Giao trnh Cau truc d lieu va Giai thuat 105
Qua frnh fhay doI nay duoc mInh hoa frong hnh 6.6. Hnh 6.6a fho hIon
vung nho duoc su dung boI chuong frnh goI M va mof so ban sao cua ham do quy
P, moI ham mof vung nho rIong. Cac muI fon xuong fho hIon su goI ham. MoI su
goI fu P don chnh no cung Ia hanh dong cuoI frong ham, vIoc duy fr vung nho
cho ham frong khI cho doI su fra vo fu ham duoc goI Ia khong can fhIof. Cach
bIon doI nhu fron so gIam kch fhuoc vung nho dang ko |hnh 6.6b). CuoI cung,
hnh 6.6c bIou dIon cac Ian goI ham P nhu mof dang Iap IaI frong cung mof muc
cua so do.

Truong hop dac bIof chung fa vua nou fron Ia vo cung quan frong v no cung
fhuong xuyon xay ra. Chung fa goI do Ia fruong hop do quy duoI |tai/ rccursion).
Chung fa non can fhan rang frong do quy duoI, vIoc goI do quy Ia hunh dong
cuo trong hum, chu khong phaI Ia dong lenh cuo duoc vet trong hum.
Trong chuong frnh co khI chung fa fhay do quy duoI xuaf hIon frong Ionh
switch hoac Ionh if frong ham ma sau do con co fho co nhIou dong Ionh khac
nua.

oI voI phan Ion cac frnh bIon djch, chI co mof su khac nhau nho gIua fhoI
gIan chay frong haI fruong hop: fruong hop do quy duoI va fruong hop no da duoc
fhay fho bang vong Ionh Iap. Tuy nhIon, nou khong gIan duoc xom Ia quan frong,
fh vIoc IoaI do quy duoI Ia raf can fhIof. o quy duoI fhuong duoc fhay boI vong
Iap while hoac do while.

Trong gIaI fhuaf chIa do frj cua baI foan Thap Ha NoI, Ian goI do quy fron
khong phaI Ia do quy duoI, Ian goI sau do moI Ia do quy duoI. Ham sau day da
duoc IoaI do quy duoI:

void move(int count, int start, int finish, int temp)
/ * move: phIon ban Iap.
pre: count Ia so dIa can dI chuyon.
post: count dIa da duoc chuyon fu st ar t sang f i ni sh dung t emp Iam noI chua fam.
*/
{
i nt swap;
while ( count > 0) { / / Thay Ionh i f frong do quy bang vong Iap.
move( count - 1, st ar t , t emp, f i ni sh) ; / / Ian goI do quy dau khong phaI
/ / do quy duoI.
cout << " Move di sk " << count << " f r om" << st ar t
<< " t o " << f i ni sh << " . " << endl ;
count - - ; / / Thay doI cac fhong so cho fuong duong voI vIoc goI do quy duoI.
swap = st ar t ;
st ar t = t emp;
t emp = swap;
}
}

Chng 6 e quy
Giao trnh Cau truc d lieu va Giai thuat 106
Thaf ra chung fa co fho nghI ngay don phuong an nay khI moI baf dau gIaI baI
foan. Nhung chung fa da xom xof no fu mof cach nhn khac, bay gIo chung fa so
Iy gIaI IaI cac dong Ionh fron mof cach fu nhIon hon. Chung fa so fhay rang haI
fhap start va temp khong co g khac nhau, do chung cung duoc su dung do Iam
noI chua fam frong khI chung fa chuyon dan cac dIa vo fhap finish.
o chuyon mof so dIa fu start vo finish, chung fa chuyon faf ca dIa frong so
do, fru caI cuoI cung, sang fhap con IaI Ia temp. Sau do chuyon dIa cuoI sang
finish.

TIop fuc Iap IaI vIoc vua roI, chung fa IaI can chuyon faf ca cac dIa fu temp,
fru caI cuoI cung, sang fhap con IaI Ia start, do co fho chuyon dIa cuoI cung sang
finish. Ian fhuc hIon fhu haI nay su dung IaI cac dong Ionh frong chuong frnh
bang cach hoan doI start voI temp. Cu nhu fho, sau moI Ian hoan doI start voI
temp, cong vIoc duoc Iap IaI y nhu nhau, kof qua cua moI Ian Iap Ia chung fa co
duoc fhom mof dIa moI fron finish.
6.2.4. Phun tIch mot so truong hop nen vu khong nen dung de quy
6.2.4.1. Gu thuu
Chung fa hay xom xof haI ham fnh gIaI fhua sau day. ay Ia ham do quy:

int factorial(int n)
/ * f act or i al : phIon ban do quy.
pre: n Ia mof so khong am.
post: fra vo frj cua n gIaI fhua.
*/
{
i f ( n == 0) r et ur n 1;
el se r et ur n n * f act or i al ( n - 1) ;
}

Va day Ia ham khong do quy:
int factorial(int n)
/ * f act or i al : phIon ban khong do quy.
pre: n Ia mof so khong am.
post: fra vo frj cua n gIaI fhua.
*/
{
i nt count , pr oduct = 1;
f or ( count = 1; count <= n; count ++)
pr oduct *= count ;
r et ur n pr oduct ;
}

Chuong frnh nao fron day su dung f vung nho hon7 VoI caI nhn dau fIon,
duong nhu chuong frnh do quy chIom f vung nho hon, do no khong co bIon cuc
bo, con chuong frnh khong do quy co don haI bIon cuc bo. Tuy nhIon, chuong
frnh do quy can mof ngan xop do chua n con so
Chng 6 e quy
Giao trnh Cau truc d lieu va Giai thuat 107
n, n-1, n-2, ..., 2, 1

Ia nhung fhong so do goI do quy |hnh 6.7), va fhoo cach do quy cua mnh, no
cung phaI nhan cac so IaI voI nhau fhoo mof fhu fu khong khac g so voI chuong
frnh khong do quy. TIon frnh fhuc hIon cua chuong frnh do quy cho n = 5 nhu
sau:





Nhu vay chuong frnh do quy chIom nhIou vung nho hon chuong frnh khong do
quy, dong fhoI no cung chIom nhIou fhoI gIan hon do chung vua phaI caf va Iay
cac frj fu ngan xop vua phaI fhuc hIon vIoc fnh foan.
6.2.4.2. Cuc so Fibonacci
Mof v du con Iang ph hon chuong frnh fnh gIaI fhua Ia vIoc fnh cac so
Fibonacci. Cac so nay duoc djnh nghIa nhu sau:

F
0
= 0, F
1
= 1, F
n
= F
n- 1
+ F
n- 2
nou n 2.

Chuong frnh do quy fnh cac so Fibonacci raf gIong voI djnh nghIa:

int fibonacci(int n)
/ * f i bonacci : phIon ban do quy.
pre: n Ia mof so khong am.
post: fra vo so Fibonacci fhu n.
*/
{
i f ( n <= 0) r et ur n 0;
el se i f ( n == 1) r et ur n 1;
el se r et ur n f i bonacci ( n - 1) + f i bonacci ( n - 2) ;
}


HInh 6.?
Cay do quy fnh gIaI fhua
f act or i al ( 5) =5*f act or i al ( 4)
=5*( 4*f act or i al ( 3) )
=5*( 4*( 3*f act or i al ( 2) ) )
=5*( 4*( 3*( 2*f act or i al ( 1) ) ) )
=5*( 4*( 3*( 2*( 1*f act or i al ( 0) ) ) ) )
=5*( 4*( 3*( 2*( 1*1) ) ) )
=5*( 4*( 3*( 2*1) ) )
=5*( 4*( 3*2) )
=5*( 4*6)
=5*24
=120
Chng 6 e quy
Giao trnh Cau truc d lieu va Giai thuat 108
Thuc fo, chuong frnh nay frong raf dop maf, do no co dang chIa do frj: kof
qua co duoc bang cach fnh foan haI fruong hop nho hon. Tuy nhIon, chung fa so
fhay rang day hoan foan khong phaI Ia fruong hop chIa do frj, ma Ia chIa Iam
cho phuc fap fhom.


o xom xof gIaI fhuaf nay, chung fa fhu fnh I
7
, mInh hoa frong hnh 6.8.
Truoc hof ham can fnh I
6
va I
5
. o co I
6
, phaI co I
5
va I
4
, va cu nhu fho fIop
fuc. Nhung sau khI I
5
duoc fnh do co duoc I
6
, fh I
5
so khong duoc gIu IaI. Nhu
vay do fnh I
7
sau do, I
5
IaI phaI duoc fnh IaI. Cay do quy da cho chung fa fhay
raf ro rang chuong frnh do quy phaI Iap dI Iap IaI nhIou phop fnh mof cach
khong can fhIof.Tong fhoI gIan do ham do quy fnh duoc I
n
Ia mof ham mu cua n.

Cung gIong nhu vIoc fnh gIaI fhua, chung fa co fho co duoc mof chuong frnh
don gIan bang cach gIu IaI ba bIon, do Ia frj cua so Fibonacci moI nhaf va haI so
Fibonacci ko fruoc:

int fibonacci(int n)
/ * f i bonacci : phIon ban khong do quy.
pre: n Ia mof so khong am.
post: fra vo so Fibonacci fhu n.
*/
{

HInh 6.8- Cay do quy fnh I
7
.
Chng 6 e quy
Giao trnh Cau truc d lieu va Giai thuat 109
i nt current; / / so Fibonacci hIon faI F
i

i nt last_value; / / F
i - 1

i nt last_but_one; / / F
i - 2
i f ( n <= 0) r et ur n 0;
el se i f ( n == 1) r et ur n 1;
el se {
l ast _but _one = 0;
l ast _val ue = 1;
f or ( i nt i = 2; i <= n; i ++) {
cur r ent = l ast _but _one + l ast _val ue;
l ast _but _one = l ast _val ue;
l ast _val ue = cur r ent ;
}
r et ur n cur r ent ;
}
}
Chuong frnh khong do quy nay co fhoI gIan chay fI Io voI n.
6.2.4.3. So sunh guu de quy vu khong de quy
au Ia dIou khac nhau co ban gIua chuong frnh vua roI voI chuong frnh do
quy7 o fra IoI cau hoI nay, chung fa hay xom xof IaI cay do quy. VIoc phan fch
cay do quy so dom IaI nhIou fhong fIn huu ch gIup chung fa bIof duoc khI nao fh
non su dung do quy va khI nao fh khong.

Nou mof ham goI do quy chnh no chI co mof Ian fh cay do quy so co dang raf
don gIan: do Ia mof chuoI cac mac xch, co nghIa Ia, moI nuf chI co duy nhaf mof
con. Nuf con nay fuong ung voI mof Ian goI do quy. oI voI ham gIaI fhua, do chI
don gIan Ia mof danh sach cac you cau vIoc fnh foan cac so gIaI fhua fu |n-1)! cho
don 1!. ang cach doc cay do quy fu duoI Ion fron fhay v fu fron xuong duoI,
chung fa co ngay chuong frnh khong do quy fu mof chuong frnh do quy. KhI mof
cay suy gIam fhanh mof danh sach, vIoc chuyon fu chuong frnh do quy fhanh
chuong frnh khong do quy fhuong do dang, va kof qua co duoc fhuong fIof kIom
ca khong gIan Ian fhoI gIan.

Iuu y rang mof ham goI do quy chnh ban fhan no co fho co nhIou dang khac
nhau. ong goI do quy hoac Ia chI xuaf hIon mof Ian frong mof vong Iap nhung
fhuc su IaI duoc goI nhIou Ian, hoac Ia xuaf hIon haI Ian frong Ionh ro nhanh if,
else nhung fhuc su chI duoc fhuc hIon co mof Ian.

Cay do quy fnh cac so Fibonacci khong phaI Ia mof chuoI cac mac xch. No
chua mof so raf Ion cac nuf bIou dIon nhung cong vIoc duoc Iap IaI. KhI chuong
frnh do quy chay, no fao mof ngan xop do su dung frong khI duyof qua cay. Tuy
nhIon, cac kof qua Iuu vao ngan xop khI Iay ra chI duoc su dung co mof Ian va so
bj maf dI ma khong fho su dung IaI |v dInh ngan xop sau khI duoc fruy xuaf can
duoc IoaI bo moI co fho fruy xuaf fIop nhung phan fu khac frong ngan xop), va
nhu vay mof cong vIoc nao do co fho phaI duoc fhuc hIon nhIou Ian.
Chng 6 e quy
Giao trnh Cau truc d lieu va Giai thuat 110
Trong nhung fruong hop nhu vay, fof hon hof Ia fhay ngan xop bang mof cau
fruc du IIou khac, mof cau fruc du IIou ma cho phop fruy nhap vao nhIou vj fr
khac nhau fhay v chI o dInh nhu ngan xop. Trong v du don gIan vo cac so
Fibonacci, chung fa chI can fhom haI bIon fam do chua haI frj can cho vIoc fnh
so moI.

CuoI cung, khac voI vIoc mof chuong frnh do quy fu fao cho mnh mof ngan
xop rIong, bang cach fao mof ngan xop fuong mInh, chung fa Iuon co fho chuyon
moI chuong frnh do quy fhanh chuong frnh khong do quy. Chuong frnh khong
do quy fhuong phuc fap va kho hIou hon. Nou mof chuong frnh do quy co fho
chay duoc voI mof khong gIan va fhoI gIan cho phop, fh chung fa khong non khu
do quy fru fruong hop ngon ngu Iap frnh ma chung fa su dung khong co kha
nang do quy.
6.2.4.4. So sunh guu Fibonacci vu Thup Hu No: kIch thuoc cuu lo gu
Ham do quy fnh cac so Fibonacci va ham do quy gIaI baI foan Thap Ha NoI
dou co dang chIa do frj raf gIong nhau. MoI ham dou goI do quy chnh no haI Ian
cho cac fruong hop nho hon. Tuy nhIon, v sao chuong frnh Thap Ha NoI IaI vo
cung hIou qua frong khI chuong frnh fnh cac so Fibonacci IaI hoan foan nguoc
IaI7 Cau fra IoI IIon quan don kch fhuoc cua IoI gIaI. o fnh mof so Fibonacci,
ro rang kof qua ma chung fa can chI co moI mof so, va chung fa mong muon vIoc
fnh foan so hoan faf qua mof so f cac buoc, nhu Ia cac dong Ionh frong chuong
frnh khong do quy. Trong khI do, chuong frnh do quy Fibonacci IaI fhuc hIon
qua nhIou buoc. Trong chuong frnh Thap Ha NoI, nguoc IaI, kch fhuoc cua IoI
gIaI Ia so cac IoI chI dan can In ra cho cac IInh muc va Ia mof ham mu cua fong so
dIa.
6.2.5. Cuc nhun xet
o dI don kof Iuan vo gIaI phap Iua chon cho mof chuong frnh do quy hay
khong do quy, dIom baf dau fof nhaf cung Ia xom xof cay do quy. Nou cay do quy
co dang don gIan, chuong frnh khong do quy so fof hon. Nou cay chua nhIou cong
vIoc duoc Iap IaI ma cac cau fruc du IIou khac fhch hop hon Ia ngan xop, fh do
quy cung khong con can fhIof nua. Nou cay do quy fhuc su ram rap, ma frong do
so cong vIoc Iap IaI khong dang ko, fh chuong frnh do quy Ia gIaI phap fof nhaf.

Ngan xop duoc su dung khI do quy |do chuong frnh do quy fu fao Iay) duoc
xom nhu mof danh sach chua cac cong vIoc can fr hoan cua chuong frnh. Nou
danh sach nay co fho duoc fao fruoc, fh chung fa non vIof chuong frnh khong do
quy, nguoc IaI, chung fa so vIof chuong frnh do quy. o quy nhu mof cach fIop
can fu fron xuong khI can gIaI quyof van do, no chIa baI foan fhanh nhung baI
foan nho hon, hoac chon ra buoc chu you va fr hoan cac buoc con IaI. Chuong
frnh khong do quy gan voI cach fIop can fu duoI Ion, no baf dau fu nhung caI da
bIof va fung buoc xay dung non IoI gIaI.
Chng 6 e quy
Giao trnh Cau truc d lieu va Giai thuat 111
Mof chuong frnh do quy Iuon co fho duoc fhay fho boI mof chuong frnh
khong do quy co su dung ngan xop. Iou nguoc IaI cung Iuon dung: mof chuong
frnh khong do quy co su dung ngan xop co fho duoc fhay boI chuong frnh do quy
khong co ngan xop. o do, khong nhung nguoI Iap frnh fhuong phaI fu hoI co
non khu do quy hay khong, ma doI khI chnh ho IaI can daf cau hoI nguoc IaI, co
non chuyon fhanh do quy mof chuong frnh khong do quy co su dung ngan xop
hay khong. Iou fhu haI nay co fho dan don mof chuong frnh gan voI ban chaf
fu nhIon cua baI foan hon va do do do hIou hon. o cung Ia mof cach do caI fIon
cach fIop can baI foan cung nhu cac kof qua daf duoc.

Co mof so IoI khuyon frong vIoc su dung do quy, do Ia chung fa khong non
dung do quy khI cau fra IoI cho baf ky cau hoI nao duoI day dou Ia khong:
an fhan gIaI fhuaf hoac cau fruc du IIou co fnh chaf do quy mof cach fu
nhIon7
IoI gIaI do quy ngan gon va do hIou hon7
IoI gIaI do quy doI hoI mof khong gIan va fhoI gIan chap nhan duoc7

Cuc buoc go y trong vec khu de quy duo

1. Su dung mof bIon do fhay fho cho vIoc goI do quy fro IaI.
2. Su dung mof vong Iap voI dIou kIon kof fhuc gIong nhu dIou kIon dung cua
do quy.
3. af faf ca cac Ionh von can fhuc hIon frong Ian goI do quy duoI vao frong
vong Iap.
4. Thay Ionh goI do quy bang mof phop gan.
5. ung cac Ionh gan do gan cac frj nhu Ia cac fhong so ma ham do quy Io ra
nhan duoc.
6. Tra vo frj cho bIon da djnh nghIa o buoc 1.

Cuc buoc go y trong vec khu de quy mot cuch tong quut

Chung fa co fho fao mof ngan xop do chua cac ban ghI. Ionh goI do quy va Ionh
fra vo fu ham do quy co fho duoc fhay fho nhu sau. MoI Ionh goI do quy co fho
duoc fhay boI:
1. ua vao ngan xop mof ban ghI chua cac bIon cuc bo, cac fhong so va vj fr
dong Ionh ngay sau Ionh goI do quy.
2. Can moI fhong so vo cac frj moI fhch hop.
3. Tro vo fhuc hIon dong Ionh dau fIon frong gIaI fhuaf do quy.
4. MoI Ionh fra vo cua ham do quy duoc fhay boI:
5. Iay fu ngan xop do khoI phuc moI bIon cuc bo va fhong so.
6. af dau fhuc hIon dong Ionh faI vj fr ma fruoc do da duoc caf frong ngan
xop.
Chng 6 e quy
Giao trnh Cau truc d lieu va Giai thuat 112
6.3. Phuong phup quuy lu (backtracking)
Nhu mof ung dung kha phuc fap vo do quy, chung fa hay xom xof mof cau do
raf pho bIon vo vIoc Iam cach nao do daf fam con hau fron mof ban co co fam
hang va fam cof sao cho chung khong fho nhn fhay nhau. Thoo Iuaf cua ban co
fh mof con hau co fho nhn fhay nhung con co khac nam fron hang, hoac cof,
hoac haI duong choo co chua no.

Iam cach nao do gIaI cau do nay, dIou nay con kha mo ho. Ngay ca nha foan
hoc noI fIong Causs C. I. van chua fm ra duoc mof IoI gIaI day du khI ong xom
xof cau do nay vao nam 1850. Iou fhuong xay ra doI voI cac cau do duong nhu
Ia khong co mof cach nao co fho dua ra cac IoI gIaI co duoc su phan fch day du,
ma chI co nhung IoI gIaI duoc phaf hIon mof cach fnh co do su may man cua mof
so Ian ap dung phuong phap fhu saI, hoac sau khI da fhuc hIon mof so Iuong
khong Io cac phop fnh. Hnh 6.9 cho chung fa haI phuong an fhoa you cau cau do
va cung cho chung fa fIn rang cau do co IoI gIaI.

Trong phan nay, chung fa so phaf frIon haI chuong frnh do gIaI baI foan fam
con hau, dong fhoI chung fa cung so fhay duoc rang, vIoc Iua chon cac cau fruc du
IIou co fho anh huong Ion mof chuong frnh do quy nhu fho nao.

6.3.1. Lo gu cho bu toun tum con huu
af ky aI khI fhu fm IoI gIaI cho baI foan fam con hau fhuong ngay Iap fuc bj
cuon huf vao vIoc fm cach daf nhung con hau Ion ban co, co fho Ia ngau nhIon, co
fho fhoo mof fraf fu Iuan Iy nao do, nhung du cach nao dI nua fh dIou chac chan
xay ra Ia con hau duoc daf sau so khong bao gIo duoc nhn fhay cac con hau da
duoc daf fruoc do. ang cach nay, nou may man, mof nguoI co fho daf duoc ca


HInh 6.9- HaI cau hnh fhoa dIou kIon cua baI foan fam con hau.
Chng 6 e quy
Giao trnh Cau truc d lieu va Giai thuat 113
fam con hau fhoa you cau baI foan, va do Ia mof IoI gIaI. Nou khong may, mof
hoac nhIou con hau so phaI duoc Iay dI do daf IaI vao nhung cho khac va vIoc fm
IoI gIaI IaI duoc fIop fuc.

Chung fa so vIof mof ham do quy solve_from do gIaI baI foan nay. Cong vIoc
can Iam faI mof fhoI dIom |mof frang fhaI nao do cua ban co ma so hau chua du)
Ia:
af fhom mof con hau vao mof vj fr hop Io.
CoI do quy do xu Iy fuong fu voI so hau can xu Iy fIop da gIam 1.

Iop Queens duoI day so co mof so phuong fhuc can fhIof ma chung fa so ban
don chI fIof sau. O day chung chI can bIof rang doI fuong configuration cua no
so chua mof frang fhaI cua ban co. KhI no Iam fhong so cho Ian do quy bon frong,
no da co duoc fhom mof con hau hop Io. Trong Ian goI solve_from dau fIon fu
chuong frnh chnh, so hau can gIaI quyof Ia 8 va ban co chua co hau nao.

solve_from(Queens configuration)
{
1. if conf i gur at i on Queens da co fam con hau
1. pr i nt conf i gur at i on
2. else
1. for moI o cua ban co ma chua bj nhn fhay boI con hau nao {
1. af mof con hau Ion o p cua conf i gur at i on;
2. solve_from( conf i gur at i on) ;
3. Iay con hau ra khoI o p cua conf i gur at i on;
}
}

Ro rang Ia sau moI buoc do quy, kch fhuoc baI foan gIam dan. Chung fa co
dIom dung cua do quy Ia khI ca 8 con hau dou da fm duoc vj fr fhch hop |Ionh
ro nhanh if), hoac khI khong con fm duoc vj fr nao hop Io cho con hau can daf
fIop nua |fruong hop vong Iap for da quof hof cac vj fr hop Io con IaI).

VIoc daf mof con hau o mof o p chI Ia mof buoc fhu nghIom, chung fa van con
chua fhay doI vj fr cua no frong khI ma chung fa con co fho fIop fuc daf nhung
con hau khac cho don khI daf duoc ca 8 con. Va cung gIong nhu khI nguoI fa Iam
bang fay, khI khong con vj fr nao co fho daf fIop hau, ham solve_from cung
phaI Iay dI nhung con hau da daf |dong Ionh 2. 1. 3) do fIop fuc fhu voI nhung vj
fr hop Io khac |vong Iap f or so Ian Iuof chuyon sang cac vj fr nay). Ro rang Ia
nou khong fho fIop fuc daf fhom mof con hau nao do nua fh vIoc quay IuI Ia do
fhay doI Ian fhu nghIom vua roI sang mof phuong an khac do fIop fuc fm IoI gIaI.
Tuy nhIon, gIaI fhuaf quay IuI cua chung fa con co mof dac dIom nua Ia khI da daf
duoc IoI gIaI cho ca 8 con hau, fh chuong frnh cung van quay IuI, va vIoc quay IuI
nay Ia do fm fhom nhIou IoI gIaI khac. Tom IaI, khI mof Ian goI do quy bon frong
Chng 6 e quy
Giao trnh Cau truc d lieu va Giai thuat 114
kof fhuc, chuong frnh cua chung fa so Iuon IuI mof buoc do khao saf fIop cac kha
nang khac con IaI, va gIaI fhuaf so cho dap an Ia faf ca cac IoI gIaI cua baI foan.

6.3.2. VI du vo bon con Huu
Chung fa so xof xom gIaI fhuaf fron duoc fhuc hIon nhu fho nao cho mof
fruong hop don gIan, do Ia baI foan daf bon con hau Ion ban co 4x4, hnh 6.10.

Chung fa can phaI daf moI con hau Ion mof hang cua ban co. Chung fa Iuon
baf dau fhu fu o cuc fraI con hop Io cua hang. O ha ng fron cung chung fa chon o o
goc fraI |hnh 6.10a). Cac dau hoI danh dau nhung Iua chon hop Io khac ma chung
fa chua fhu don. Truoc khI fhu cac o nay, chung fa chuyon sang hang fhu haI. HaI
o dau fIon da bj nhn fhay boI con hau o hang 1, chung fa danh dau bang dau
choo. O fhu 3 va fhu 4 con fu do, chung fa fIop fuc fhu voI o fhu 3 va dang dau
hoI cho o fhu 4. TIop fhoo chung fa chuyon xuong hang fhu 3, nhung ca bon o o
hang nay dou da bj nhn fhay boI mof frong haI con hau o haI hang fron. Xom
nhu chung fa da gap dIom chof.

KhI gap mof dIom chof, chung fa can phaI quay nguoc IaI va bo dI su Iua chon
moI nhaf do fhu mof kha nang khac. Truong hop nay fho hIon frong hnh 6.10b),
con hau o hang fhu nhaf khong doI nhung con hau o hang fhu haI da duoc fhu voI
vj fr con IaI Ia o fhu 4 |o fhu 3 vua fhu fhaf baI duoc danh dau choo). Sau do
chung fa fhay o hang fhu ba chI co o fhu 2 Ia fu do, nhung khI fIop fuc sang hang
fhu 4 fh cung khong con o nao fu do. Iuc nay chung fa IaI gap mof dIom chof
moI, chung fa IaI can phaI quay nguoc IaI.

TaI dIom nay, quay nguoc Ion hang fron, chung fa fhay hang fhu ba khong
con kha nang Iua chon nao, nguoc Ion hang fhu haI cung vay. o do chung fa
phaI quay nguoc Ion don hang fhu nhaf, o fhu moI frong hang nay Ia o fhu 2
|hnh 6.10c). KhI dI xuong, chung fa fhay hang fhu haI chI co mof kha nang Iua
chon, do Ia o fhu 4. Xuong hang fhu ba chI co o fhu 1 Ia fu do. CuoI cung, o hang
fhu fu co mof o fu do Ia o 3. Tuy nhIo n day chI Ia mof fruong hop fhoa you cau

HInh 6.10 IoI gIaI cho baI foan bon con hau
Chng 6 e quy
Giao trnh Cau truc d lieu va Giai thuat 115
baI foan, ma chua phaI Ia mof IoI gIaI fron von cho baI foan daf bon con hau Ion
ban co 4x4.

Nou muon fm moI IoI gIaI, chung fa co fho fIop fuc bang cach fuong fu: quay
nguoc IaI Ian Iua chon moI nhaf do fhu voI kha nang fIop fhoo. Trong hnh 6.10c
khong con Iua chon nao khac o hang fhu fu, hang fhu ba va hang fhu haI. o do
chung fa nguoc Ion don hang fhu nhaf, fhu o fhu 3. Iua chon nay dan don mof IoI
gIaI duy nhaf o hnh 6.10d.

CuoI cung, khI fhu voI o 4 o hang fhu nhaf, chung fa cung khong fhu fhom
mof kof qua nao. Thuc ra, cau hnh voI con hau o o 3 va con hau o o 4 cua hang
fhu nhaf chnh Ia haI hnh anh nguoc cua o 2 va o 1 fuong ung. Nou chung fa dI
fu fraI sang phaI fron hnh 6.10c, chung fa co duoc cau hnh o hnh 6.10d.

6.3.3. Phuong phup quuy lu (Backtracking)
Phuong phap fron duoc goI Ia gIaI fhuaf quay IuI. Trong do, vIoc fm mof IoI
gIaI day du duoc fhuc hIon bang cach xay dung cac IoI gIaI rIong phan sao cho
chung Iuon fhoa nhung dIou kIon cua baI foan. CIaI fhuaf duoc ap dung do koo daI
mof IoI gIaI rIong phan cho fhanh mof IoI gIaI fron von. Tuy nhIon, faI mof buoc
nao do, nou co su vI pham dIou kIon cua baI foan, gIaI fhuaf so quay nguoc fro IaI,
bo dI su Iua chon moI nhaf do fhu voI mof kha nang cho phop khac.

CIaI fhuaf quay IuI fo ra hIou qua frong nhung fruong hop ma ban dau fuong
nhu co raf nhIou kha nang Iua chon, nhung sau do chI mof so f kha nang Ia con
sof IaI sau fIon frnh kIom fra xa hon. Trong cac baI foan xop fhoI khoa bIou,
chang han frong vIoc fo chuc cac vong dau fho fhao, su Iua chon fhoI gIan cho
mof so fran dau ban dau fhuong Ia raf do, nhung cang vo sau, cac rang buoc so
Iam gIam dang ko cac kha nang co fho.

Phan fIop fhoo day chung fa so fm hIou cach hIon fhuc cu fho cho baI foan
con hau cung nhu mof so chuong frnh IIon quan don cac fro choI, do fhay duoc y
fuong do quy va gIaI fhuaf quay IuI Ia cof IoI cua nhung baI foan o dang nay.

6.3.4. Phuc thuo chung cho chuong trInh dut cuc con huu len bun co
6.3.4.1. Chuong trInh chInh
Mac du chung fa con phaI xac djnh raf nhIou chI fIof vo cau fruc du IIou do
chua cac vj fr cua cac con hau fron ban co, nhung o day chung fa van co fho vIof
fruoc chuong frnh chnh do goI ham do quy ma chung fa da phac fhao.

Chng 6 e quy
Giao trnh Cau truc d lieu va Giai thuat 116
au fIon cac fhong fIn vo chuong frnh so duoc In ra. o vIoc kIom fra chuong
frnh voI nhung baI foan nho hon Ia co ch, chang han voI baI foan chI co bon con
hau, chung fa so cho phop nguoI su dung nhap vao so con hau fhoo y muon. ay
cung Ia kch fhuoc cua ban co |board-size). Hang so max_board so duoc khaI
bao frong fIIo queens.h.

i nt main( )
/ *
pre: NguoI su dung can cho bIof kch fhuoc cua ban co.
post: MoI IoI gIaI cho baI foan cac con hau duoc In ra.
uses: Iop Queens va ham do quy sol ve_f r om.
*/
{
i nt boar d_si ze;
pr i nt _i nf or mat i on( ) ;
cout << " What i s t he si ze of t he boar d? " << f l ush;
ci n >> boar d_si ze;
i f ( boar d_si ze < 0 | | boar d_si ze > max_boar d)
cout << " The number must be bet ween 0 and " << max_boar d << endl ;


el se {
Queens configuration(board_size); / / an co chua co hau nao.
solve_from( conf i gur at i on) ;
}
}
6.3.4.2. Lop Queens
jnh nghIa bIon Queens configuration(board_size) dung mof
constructor co fhong so cua Iop Queens do fao mof ban co co kch fhuoc fhoo su
Iua chon cua nguoI su dung va khoI fao mof doI fuong Queens rong co fon Ia
configuration. oI fuong Queens rong nay duoc goI cho ham do quy cua chung
fa, frong do cac con hau so duoc daf Ian Iuof Ion ban co.

Phac fhao frong phan 6.3.1 cho fhay Iop Queens can cac phuong fhuc nhu In
mof frang fhaI, fhom mof con hau vao mof o fron ban co, Iay con hau nay dI,
kIom fra xom mof o nao do co fu do hay khong. NgoaI ra, do hIon fhuc ham
solve_from, Iop Queens cung can chua du IIou Ia board_size do chua kch
fhuoc ban co cung nhu fhuoc fnh count do dom so con hau da duoc daf Ion ban
co.

Sau khI baf dau xay dung mof cau hnh, chung fa so fm o ko fIop bang cach
nao7 Ngay khI mof con hau vua duoc daf frong mof hang nao do, khong aI IaI dI
maf fh gIo vao vIoc fm mof vj fr khac cho con hau moI cung fron cung hang do,
do no chac chan so bj nhn fhay boI con hau vua daf xong. Khong fho co nhIou
hon mof con hau frong cung mof hang. Muc dch cua chung fa Ia daf cho duoc so
con hau duoc you cau Ion ban co |boar d_si ze), va o day cung chI co board_size
Chng 6 e quy
Giao trnh Cau truc d lieu va Giai thuat 117
hang. o do moI hang phaI co chnh xac chI mof con hau. ay Ia nguyon fac fo
chIm cau |pigconbo/c princip/c): nou chung fa co n chu chIm va n caI fo va khong
cho phop nhIou hon mof con frong mof fo fh chung fa chI co fho daf moI con vao
mof fo va phaI dung hof cac fo. Chung fa co fho fIon hanh bang cach daf cac con
hau vao ban co, moI Ian cho mof hang, baf dau fu hang so 0, nhu vay count
khong chI Ia do dom so hau da duoc daf ma con Ia chI so cua hang so duoc daf
hau ko fIop.

Cac dac fa cho cac phuong fhuc cua Iop Queens nhu sau:

bool unguarded(int col) const;
post: fra vo t r ue nou o fhuoc hang count (hang dang duoc xu Iy ko fIop) va cof col khong bj
nhn fhay boI mof con hau nao khac; nguoc IaI fra vo f al se.

void insert(int col);
pre: O faI hang count va cof col khong bj nhn fhay boI baf ky con hau nao.
post: Mof con hau vua duoc daf vao o faI hang count va cof col, count fang fhom 1.

void remove(int col);
pre: O faI hang count-1 va cof col dang co mof con hau.
post: Con hau fron duoc Iay dI, count gIam dI 1.

bool is_solved() const;
post: fra vo t r ue nou so hau da daf vao ban co bang voI kch fhuoc ban co board_size; nguoc
IaI, fra vo f al se.
6.3.4.3. Hum de quy solve_from
VoI cac dac fa fron ham solve_from da phac fhao frong phan fruoc da duoc
cu fho hoa nhu sau. Tham so configuration duoc goI fham chIou do bon frong ham co fhay
doI no.

voi d solve_from(Queens &conf i gur at i on)
/ *
pre: an co da chua duoc count hau hop Io faI hang 0 don hang count - 1.
post: n con hau da duoc daf hop Io Ion ban co.
uses: Iop Queens va cac ham sol ve_f r om, r ecur si vel y.
*/


{
i f ( conf i gur at i on. i s_sol ved( ) ) conf i gur at i on. pr i nt ( ) ;
el se
f or ( i nt col = 0; col < conf i gur at i on. boar d_si ze; col ++)
i f ( conf i gur at i on. unguarded( col ) ) {
conf i gur at i on. insert( col ) ;
solve_from( conf i gur at i on) ; / / CoI do quy fIop do fhom cac con hau con IaI.
conf i gur at i on. remove( col ) ;
}
}
Chng 6 e quy
Giao trnh Cau truc d lieu va Giai thuat 118
6.3.5. Tnh che: Cuu truc du leu duu ten vu cuc phuong thuc
Mof cach hIon nhIon do hIon fhuc cau hnh Queens Ia Iuu ban co nhu mof
mang haI chIou, moI phan fu bIou dIon vIoc co hay khong mof con hau. Vay mang
haI chIou Ia Iua chon dau fIon cua chung fa cho cau fruc du IIou. Tap fIn
queens. h chua djnh nghIa sau:


const i nt max_boar d = 30;

cl ass Queens {
publ i c:
Queens( i nt si ze) ;
bool i s_sol ved( ) const ;
voi d pr i nt ( ) const ;
bool unguar ded( i nt col ) const ;
voi d i nser t ( i nt col ) ;
voi d r emove( i nt col ) ;
i nt boar d_si ze; / / Kch fhuoc cua ban co bang so hau can daf.
pr i vat e:
i nt count; / / Chua so hau da daf duoc va cung Ia chI so cua hang so duoc daf fIop hau.
bool queen_square[ max_boar d] [ max_boar d] ;
};

VoI cau fruc du IIou nay, phuong fhuc fhom mof con hau do dang nhu sau:

voi d Queens: : insert( i nt col )
/ *
pre: O faI hang count va cof col khong bj nhn fhay boI baf ky con hau nao.
post: Mof con hau vua duoc daf vao o faI hang count va cof col, count fang fhom 1.
*/
{
queen_squar e[ count ++] [ col ] = t r ue;
}

Cac phuong fhuc i s_sol ved, r emove, pr i nt cung raf do va chung fa xom
nhu baI fap.

o khoI fao cau hnh Queens, chung fa can constructor co fhong so do daf
kch fhuoc cho ban co:

Queens: : Queens( int size)
/ *
post: an co duoc khoI fao chua co hau nao.
*/
{
board_size = size;
count = 0;
f or ( i nt r ow = 0; r ow < boar d_si ze; r ow++)
f or ( i nt col = 0; col < boar d_si ze; col ++)
queen_squar e[ r ow] [ col ] = false;
}
Chng 6 e quy
Giao trnh Cau truc d lieu va Giai thuat 119
Thuoc fnh count khoI gan Ia 0 v chua co con hau nao duoc daf Ion ban co.
Constructor nay duoc fhuc hIon khI chung fa vua khaI bao mof doI fuong Queens
frong chuong frnh chnh.

CuoI cung, chung fa can vIof phuong fhuc kIom fra mof o faI mof cof nao do
fron hang dau fIon chua co hau |xof fu fron xuong) co bj nhn fhay boI cac con
hau da co fron ban co hay khong. Chung fa can xof cof hIon faI va haI duong choo
dI qua o nay. VIoc xof cof fhaf do dang, con vIoc xof duong choo can mof so fnh
foan vo chI so. Chung fa hay xom hnh 6.11 cho fruong hop ban co 4x4.

Chung fa co fho goI fon cho bon huong cua haI duong choo nhu sau: duong
choo fraI-duoI |/oucr-/cjt) huong xuong duoI vo bon fraI, duong choo phaI-duoI
|/oucr-rigbt), duong choo fraI-fron |uppcr-/cjt), va duong choo phaI fron |uppcr-
rigbt).

Truoc fIon, chung fa hay xom xof duong choo fraI-fron o hnh 6.11c. Nou
chung fa baf dau fu o [ r ow] [ col ] , cac o fhuoc duong choo fraI-fron co foa do
[ r ow- i ] [ col - i ] voI i Ia so nguyon duong. uong choo fraI-fron nay phaI kof
fhuc khI gap canh fron cua ban co ( r ow- i ==0) hoac canh fraI cua ban co ( col -
i ==0) . Chung fa co fho dung vong Iap fang i fu 1 cho don khI r ow- i <0 hoac
col - i <0.

Chung fa co fho Iam fuong fu cho ba duong choo con IaI. Tuy nhIon, khI kIom
fra mof o co bj nhn fhay boI cac con hau hay khong fh chung fa khong can kIom
fra haI duong choo duoI cua o nay v fhoo gIaI fhuaf cac hang duoI van chua co
hau.
bool Queens: : unguarded( i nt col ) const
/ *
post: fra vo t r ue nou o fhuoc hang count (hang dang duoc xu Iy ko fIop) va cof col khong bj
nhn fhay boI mof con hau nao khac; nguoc IaI fra vo f al se.
*/


{
i nt i ;
bool ok = t r ue; / / so duoc gan IaI f al se nou chung fa fm fhay hau fron cung cof hoac
duong choo.
f or ( i = 0; ok && i < count ; i ++)
ok = ! queen_squar e[ i ] [ col ] ; / / kIom fra phan fron cua cof.
f or ( i = 1; ok && count - i >= 0 && col - i >= 0; i ++)
ok = ! queen_squar e[ count - i ] [ col - i ] ; / / kIom fra phan fron bon fraI cua
duong choo.
f or ( i = 1; ok && count - i >= 0 && col + i < boar d_si ze; i ++)
ok = ! queen_squar e[ count - i ] [ col + i ] ; / / kIom fra phan fron bon phaI cua
duong choo.
r et ur n ok;
}
Chng 6 e quy
Giao trnh Cau truc d lieu va Giai thuat 120
6.3.6. Xem xet lu vu tnh che
Chuong frnh ma chung fa vua hoan faf dap ung hoan foan cho baI foan fam
con hau. Kof qua chay chuong frnh cho chung fa 92 IoI gIaI khac nhau. Tuy
nhIon, voI ban co co kch fhuoc Ion hon, fhoI gIan can do chay chuong frnh raf
Ion. ang sau day cho chung fa mof vaI v du:

Kch fhuoc 8 9 10 11 12 13
So IoI gIaI 92 352 724 2680 14200 73712
ThoI gIan |scconJ) 0.05 0.21 1.17 6.62 39.11 243.05
ThoI gIan cho mof IoI gIaI
|ms.)
0.54 0.6 1.62 2.47 2.75 3.30

Nhu chung fa fhay, so Iuong IoI gIaI fang raf nhanh fhoo kch fhuoc cua ban
co, va fhoI gIan fang con nhanh hon raf nhIou, do fhoI gIan cho mof IoI gIaI cung
fang fhoo kch fhuoc ban co. Nou muon gIaI cho cac ban co kch fhuoc Ion, chung
fa can fm mof chuong frnh hIou qua hon.

Chung fa hay fm xom v sao chuong frnh cua chung fa chay qua Iau nhu vay.
Vec go de quy vu quuy lu ro rung lu chem nheu tho gun, nhung tho
gun nuy lu phun unh dung phuong phup co bun mu chung tu dung de
gu bu toun. o chnh Ia ban chaf cua gIaI fhuaf va no duoc Iy gIaI boI mof so
Iuong Ion IoI gIaI. Mof so vong Iap frong phuong fhuc unguarded cung doI hoI
mof Iuong fhoI gIan dang ko. Chung fa hay fhu xof xom co fho bo bof mof vaI
vong Iap duoc chang. Co cach nao do xof mof o co bj nhn fhay boI cac con hau
hay khong ma khong phaI xof hof cac o fron cung cof va haI duong choo bac
ngang7

Co mof cach do fhuc hIon dIou nay, do Ia cach fhay doI du IIou ma chung fa Iuu
gIu frong mang. Thay v Iuu fhong fIn cac o nao da co cac con hau, chung fa co
fho dung mang do nam gIu faf ca cuc o du b{ cuc con huu nhIn thuy. Tu do,
chung fa so do dang hon frong vIoc kIom fra xom mof o co bj cac con hau nhn
fhay hay khong. Mof su fhay doI nho co fho gIup ch cho vIoc quay IuI, boI v mof
o co fho co nhIou hon mof con hau nhn fhay. VoI moI o, chung fa co fho Iuu mot
so de dem so con huu nhIn thuy no. KhI mof con hau duoc fhom vao, chung
fa fang bIon dom nay fhom 1 cho faf ca cac o cung hang, cung cof va fron haI
duong choo cua no. Nguoc IaI, khI Iay dI mof con hau, cac bIon dom fuong ung nay
cung can gIam bof 1.

VIoc Iap frnh fhoo phuong an nay duoc danh IaI nhu baI fap. Chung fa nhan
xof fhom rang, fuy phuong an moI nay co chay nhanh hon chuong frnh dau fIon
nhung van con mof so vong Iap do cap nhaf IaI cac bIon dom vua nou. Suy nghI
Chng 6 e quy
Giao trnh Cau truc d lieu va Giai thuat 121
fhom mof chuf nua, chung fa so fhay rang chung fa co fho IoaI bo hoan foan cac
vong Iap nay.

Y fuong chnh o day Ia vIoc nhan ra rang moI hang, moI cof, moI duong choo
fron ban co dou chI co fho chua nhIou nha f Ia mof con hau. |Nguyon fac fo chIm
cau cho fhay rang, frong mof IoI gIaI, moI hang va moI cof dou co con hau, nhung
khong phaI moI duong choo dou co con hau, do so duong choo nhIou hon so hang
va so cof.)

Tu do, chung fa co fho nam gIu cuc o chuu b{ cuc con huu nhIn thuy bang
cach su dung 3 mang co cac phan fu kIou bool : col_free, upward_free, va
downward_free, frong do cac duong choo fu duoI Ion va fraI sang phaI duoc goI
Ia upuarJ, cac duong choo fu fron xuong va fraI sang phaI duoc goI Ia JounuarJ
|hnh 6.11d va o). o chung fa daf cac con hau Ion ban co moI Ian faI mof hang,
baf dau fu hang 0, chung fa khong can mof mang do bIof duoc hang nao con
frong.

CuoI cung, do In mof cau hnh, chung fa can bet so thu tu cuu cot co chuu
con huu trong mo hung, chung fa so dung mof mang cac so nguyon, moI phan
fu danh cho mof hang va chua so cua cof chua con hau frong hang do.

Cho don bay gIo, chung fa da co fho gIaI quyof fron von baI foan ma khong
can don mang haI chIou bIou dIon ban co nhu phuong an dau fIon nua, va chung
fa cung da co fho IoaI moI vong Iap fru cac vong Iap khoI fao cac frj ban dau cho
cac mang. Nho vay, fhoI gIan can fhIof do chay chuong frnh moI nay phan anh
mof cach chaf cho so buoc can khao saf frong phuong phap quay IuI.
Chng 6 e quy
Giao trnh Cau truc d lieu va Giai thuat 122

Chung fa so danh so cho cac o frong mof duong choo nhu fho nao7 ChI so cua
duong choo upuarJ daI nhaf frong mang haI chIou nhu sau:

[ boar d_si ze- 1] [ 0] , [ boar d_si ze- 2] [ 1] , . . . , [ 0] [ boar d_si ze- 1]

ac fnh chung cua cac chI so nay Ia fong cua hang va cof Iuon Ia
|board_size1). Iou nay goI y rang, nhu hnh 6.11o, baf ky mof duong choo
upuarJ nao cung co fong cua hang va cof cua moI o dou Ia mof hangso. Tong nay
baf dau fu 0 cho duong choo upuarJ co chIou daI Ia 1 faI goc fraI fron cung cua
mang, cho don( 2xboard_size2) cho duong choo upuarJ co chIou daI Ia 1 faI
goc phaI duoI cung cua mang. o do chung fa co fho danh so cho cac duong choo
upuarJ fu 0 don ( 2xboard_size2) , va nhu vay, o o hang i va cof j so fhuoc
duong choo upuarJ co so fhu fu Ia i+j.



HInh 6.11 Cac chI so cua cac o frong ban co
Chng 6 e quy
Giao trnh Cau truc d lieu va Giai thuat 123
ang cach fuong fu, nhu hnh 6.11d, cac duong choo JounuarJ co hIou gIua
hang va cof Ia mof hang so, fu ( board_size+1) en ( board_size1) . Cac
duong choo JounuarJ so duoc danh so fu 0 don ( 2xboard_size1) , mof o faI
hang i va cof j fhuoc duong choo JounuarJ co so fhu fu ( ij+board_size1) .

Sau khI da co cac chon Iua fron chung fa co djnh nghIa moI cho Iop Queens
nhu sau:

cl ass Queens {
publ i c:
Queens( i nt si ze) ;
bool i s_sol ved( ) const ;
voi d pr i nt ( ) const ;
bool unguar ded( i nt col ) const ;
voi d i nser t ( i nt col ) ;
voi d r emove( i nt col ) ;
i nt boar d_si ze;
pr i vat e:
i nt count;
bool col_free[ max_boar d] ;
bool upward_free[ 2 * max_boar d - 1] ;
bool downward_free[ 2 * max_boar d - 1] ;
i nt queen_in_row[ max_boar d] ; / / so fhu fu cua cof chua hau frong moI hang.
};

Chung fa so hoan faf chuong frnh qua vIoc hIon fhuc cac phuong fhuc cho Iop
moI. au fIon Ia constructor khoI gan faf ca cac frj can fhIof cho cac mang.

Queens: : Queens( i nt si ze)
/ *
post: The Queens obj ect i s set up as an empt y
conf i gur at i on on a chessboar d wi t h si ze squar es i n each r ow and col umn.
*/
{
board_size = si ze;
count = 0;
f or ( i nt i = 0; i < boar d_si ze; i ++) col_free[ i ] = t r ue;
f or ( i nt j = 0; j < ( 2*boar d_si ze - 1) ; j ++) upward_free[ j ] = t r ue;
f or ( i nt k = 0; k < ( 2*boar d_si ze - 1) ; k++) downward_free[ k] = t r ue;
}

Phuong fhuc i nser t chI can cap nhaf cof va haI duong choo dI ngang qua o
faI [ count ] [ col ] Ia da bj nhn fhay boI con hau moI fhom vao, cac frj nay cung
co fho Ia f al se san fruoc do do chung da bj cac con hau fruoc do nhn fhay.

voi d Queens: : insert( i nt col)
/ *
Pre: The squar e i n t he f i r st unoccupi ed r ow ( r ow count ) and col umn col
i s not guar ded by any queen.
Post: A queen has been i nser t ed i nt o t he squar e at r ow count and col umn
col ; count has been i ncr ement ed by 1.
*/
Chng 6 e quy
Giao trnh Cau truc d lieu va Giai thuat 124
{
queen_i n_r ow[ count] = col;
col _f r ee[ col] = f al se;
upwar d_f r ee[ count + col] = f al se;
downwar d_f r ee[ count - col + board_size - 1] = f al se;
count ++;
}

CuoI cung phuong fhuc unguar ded chI can kIom fra cof va haI duong choo dI
ngang qua o faI [ count ] [ col ] co bj cac con hau nhn fhay hay chua.

bool Queens: : unguarded( i nt col) const
/ *
Post : Ret ur ns t r ue or f al se accor di ng as t he squar e i n t he f i r st
unoccupi ed r ow ( r ow count ) and col umn col i s not guar ded by any queen.
*/
{
r et ur n col _f r ee[ col]
&& upwar d_f r ee[ count + col]
&& downwar d_f r ee[ count - col + board_size - 1] ;
}

Chung fa fhay rang phuong fhuc fron don gIan hon frong phuong an dau fIon cu a
no raf nhIou. Cac phuong fhuc con IaI Is_soIvod, romovo, va prInf xom nhu baI
fap. ang sau day cho cac con so nhan duoc fu chuong frnh cuoI cung nay.

Kch fhuoc 8 9 10 11 12 13
So IoI gIaI 92 352 724 2680 14200 73712
ThoI gIan |soconds) 0.01 0.05 0.22 1.06 5.94 34.44
ThoI gIan cho mof IoI gIaI
|ms.)
0.11 0.14 0.30 0.39 0.42 0.47

VoI fruong hop fam con hau, chuong frnh moI chay nhanh gap 5 Ian chuong
frnh cu. KhI kch fhuoc ban co fang Ion fI Io nay con cao hon nua, nhu fruong
hop 13 con hau, chuong frnh moI chay nhanh gap 7 Ian chuong frnh cu.

6.3.7. Phun tIch ve phuong phup quuy lu
Chung fa so fong kof phan nay qua vIoc phong doan fong so cac cong vIoc ma
chuong frnh cua chung fa phaI Iam.
6.3.7.1. TInh heu quu cuu phuong phup quuy lu
Chung fa baf dau bang vIoc fnh xom vIoc quay IuI da nho duoc bao nhIou cong
vIoc so voI faf ca cac cong vIoc co fho co. Xof fruong hop ban co 8x8, nou chung fa
fIop can baI foan mof cach don gIan ba ng cach vIof mof chuong frnh fm faf ca
cac phuong an do xop sao cho du fam con hau Ion ban co roI sau do moI IoaI cac
Chng 6 e quy
Giao trnh Cau truc d lieu va Giai thuat 125
fruong hop khong hop Io, voI moI cau hnh Ia mof su Iua chon 8 vj fr frong 64 vj
fr, chung fa co so cau hnh can khao saf Ion don:

64
8 = 4,426,165,368.

Nou chung fa nhn fhay duoc rang moI hang chI co fho co mof con hau fh so
cau hnh can fhu gIam ngay xuong:

8
8
= 16,777,216.

Con so nay van con raf Ion. Chung fa fIop fuc cho rang moI cof chI co fho co
mof con hau, so Iua chon cac cof con fu do fron moI hang so Ia 8, 7, ..., 1. Tong so
Iua chon fron 8 hang hoan foan co fho duoc xu Iy boI may fnh:

8! = 40,320.

va so fruong hop ma chuong frnh cua chung fa phaI xom xof con nho hon, do
nhung o o hang dang xof ma fhuoc cung duong choo voI cac con hau o nhung
hang fron fh da bj bo qua ngay Iap fuc.

Cach hoaf dong cua qua frnh quay IuI cho fhay fnh hIou qua cua no nhu sau:
cac vj fr da duoc cho rang khong chap nhan duoc so ngan can su khao saf fIop
cac duong dI vo ch sau do.

Mof cach khac do bIou dIon hanh vI cua vIoc quay IuI Ia vIoc xom xof cay do
quy cua ham do quy soIvo_from, hnh 6.12 fho hIon mof phan cua cay nay. HaI IoI
gIaI co frong hnh fuong ung voI haI IoI gIaI frong hnh 6.9. MoI nuf frong cay co
fho co foI da Ia fam nuf con fuong ung fam Ian goI do quy ham sol ve_f r omvoI

HInh 6.12 Mof phan cua cay do quy cho baI foan fam con hau
Chng 6 e quy
Giao trnh Cau truc d lieu va Giai thuat 126
fam frj hop Io cua new_col . Tuy nhIon, ngay ca faI cac muc gan voI nuf goc,
phan Ion cac nhanh nay dou duoc xac djnh som Ia khong fhoa, va hIon nhIon
rang cu moI nuf cha khong fhoa dIou kIon cua baI foan fh frong cay cung khong
xuaf hIon fIop cac nuf con cua no. Phuong phap quay IuI Ia mof cong cu vo cung
hIou qua do fhu gIam mof cay do quy vo mof kch fhuoc co fho xu Iy duoc.
6.3.7.2. Cuc cun duo
VoI baI foan n con hau, fong so cong vIoc can duoc fhuc hIoc boI phuong phap
quay IuI fang raf nhanh fhoo n. Chung fa fhu hnh dung foc do fang fruong nay
nhanh don co nao. KhI daf mof con hau vao mof hang fron ban co, no so IoaI fru
nhIou nhaf Ia ba vj fr o hang duoI |mof vj fr cung cof va haI vj fr choo). oI voI
hang fhu nhaf, vIoc quay IuI so khao saf faf ca n vj fr. O hang fhu haI, co f nhaf
n-3 vj fr can khao saf; hang fhu ba Ia n-6, va cu fho. V vay, do daf cac con hau
Ion n/4 hang dau fIon, vIoc quay IuI can khao saf f nhaf so vj fr:

n|n-3)|n-6)...|n-3n/4)

Tch nay > |n/4)
n/4
do co faf ca n/4 fhua so va fhua so cuoI cung Ia n/4, cac fhua so
khac dou Ion hon n/4. o hnh dung con so nay fang nhanh fhoo n nhu fho nao,
chung fa nho IaI rang baI foan fhap Ha NoI can co 2
n
buoc cho n dIa, ma |n/4)
n/4

con fang nhanh hon 2
n
nhIou khI n fang. o fhay duoc dIou nay, chung fa co:

Iog ||n/4)
n/4
) Iog |n/4)
=
Iog |2
n
) 4 Iog |2)

TI Io nay fang khong gIoI han khI n fang. Chung fa noI 2
n
fang fhoo ham mu, con
|n/4)
n/4
con fang nhanh hon raf nhIou. Vay voI n Ion, chuong frnh ap dung
phuong phap quay IuI cho baI foan fhap Ha NoI fron cung so chay raf cham.
6.3.7.3. So lo gu
Chung fa van chua chung mInh rang vIoc In moI IoI gIaI cho baI foan n con
hau voI n Ion Ia khong fho fhuc hIon duoc bang may fnh, ma chI moI chI ra rang
phuong phap quay IuI Ia khong fho Iam duoc. Co fho con mof so gIaI fhuaf fhong
mInh hon nao do co fho In cac IoI gIaI mof cach nhanh chong hon gIaI fhuaf quay
IuI. Tuy nhIon, dIou chung fa quan fam o day khong phaI Ia kha nang cua may
fnh ma Ia so IoI gIaI fhuc su cua baI foan n con hau. Iou da co fho chung mInh
duoc Ia so IoI gIaI cua baI foan nay khong fho duoc gIoI han boI baf ky mof da
fhuc bac n nao. Tham ch so IoI gIaI nay duong nhu con khong fho bj gIoI han boI
mof bIou fhuc ham mu k
n
, voI k Ia mof hang so, nhung vIoc chung mInh dIou nay
van con Ia mof baI foan chua co IoI gIaI.

Chng 6 e quy
Giao trnh Cau truc d lieu va Giai thuat 127
6.4. Cuc chuong trInh co cuu truc cuy: du doun truoc trong cuc
tro cho
Trong cac fro choI fr fuo, con nguoI co fho du doan fruoc mof so buoc. Trong
phan nay chung fa phaf frIon mof gIaI fhuaf cho may fnh do fham gIa cac fro
choI co khao saf fruoc mof so buoc dI. Chung fa so frnh bay gIaI fhuaf qua hnh
anh cua mof cay va su dung do quy do Iap frnh cho cau fruc nay.

6.4.1. Cuc cuy tro cho
Chung fa co fho vo ra cac buoc dI chuyon co fho co qua hnh anh cua mof cay
fro choI, frong do goc cay Ia frang fhaI ban dau, cac canh xuaf phaf fu goc Ia cac
buoc dI hop Io cua nguoI choI fhu nhaf. O muc ko fIop, cac canh IaI bIou dIon cac
buoc dI hop Io cua nguoI choI fhu haI fuong ung voI moI cach dI cua nguoI fhu
nhaf, va cu nhu fho. Nou cho rang muc cua goc Ia 0 fh cac canh xuaf phaf fu cac
nuf co muc chan bIou dIon buoc dI cua nguoI fhu nhaf, cac canh xuaf phaf fu cac
nuf co muc Io bIou dIon buoc dI cua nguoI fhu haI.
Hnh 6.13 Ia cay fro choI day du cua fro choI So fam. Trong fro choI nay,
nguoI choI fhu nhaf so Iua chon mof frong cac so 1, 2, hoac 3. MoI buoc sau do,
moI nguoI choI so duoc quyon chon mof frong ba so 1, 2, hoac 3, nhung khong
duoc frung voI so ma nguoI kIa vua chon xong. Cac canh frong cay mang con so
do nguoI choI chon. Tong cac so duoc chon so duoc cong fch Iuy dan. Nou don Iuof
mnh, nguoI choI chon duoc con so Iam cho fong nay dung bang fam fh so Ia
nguoI fhang cuoc; nou fong vuof qua fam fh nguoI con IaI so fhang. Tro choI nay

HInh 6.13 Cay cho fro choI so fam
Chng 6 e quy
Giao trnh Cau truc d lieu va Giai thuat 128
khong co kha nang hoa. Trong so do, I co nghIa Ia nguoI fhu nhaf fhang cuoc, va
S Ia nguoI fhu haI fhang cuoc.

Ngay mof fro choI fam fhuong nhu fro choI So fam fron day cung da sInh ra
mof cay co kch fhuoc khong nho. Cac fro choI fhuc su hap dan fua nhu co vua
con co cay fro choI Ion hon raf nhIou, va chung fa cung khong hy vong g vao vIoc
co fho khao saf hof cac canh cua no. Nhu vay, mof chuong frnh chay frong mof
fhoI gIan cho phop chI co fho khao saf mof vaI muc duoI mof nuf hIon faI cua cay.
Con nguoI khI choI nhung fro choI nay cung khong fho nhn fhay duoc moI kha
nang phaf frIon cay cho don khI fro choI kof fhuc, nhung ho co fho co mof so Iua
chon fhong mInh, boI v, fhoo kInh nghIom, fhong fhuong mof nguoI co fho nhan
bIof ngay mof vaI fnh huong nay Ia fof hon so voI cac fnh huong khac, mac du
ho cung khong bao dam duoc Ia so fhang.

oI voI moI fro choI hap dan ma chung fa muon choI bang may fnh, chung fa
can mof ham goI Ia ham Iuong gIa do kIom fra mof fnh huong hIon faI vo muc do
fhuan IoI cua no.

6.4.2. Phuong phup Mnmux
Hnh 6.14 Ia mof cay con bIou dIon mof phan cua mof cay fro choI voI muc
dch mInh hoa cho baf ky fro choI nao. Coc cay con nay bIou dIon vj fr hIon faI
ma chung fa dang muon nhn fruoc cac buoc dI. Chung fa chI can ham Iuong gIa
faI cac nuf Ia cua cay con nay |do Ia nhung vj fr ma chung fa so khong nhn foI
fruoc xa hon nua), va fu cac fhong fIn nay, chung fa phaI chon ra mof cach dI cho
vj fr hIon faI. Cac nuf Ia frong cay duoc vo bang hnh vuong do phan bIof voI cac
nuf khac. Hnh 6.14 chua cac frj cho cac nuf Ia.


Hnh 6.14 Cay tro chi vi cac tr c gan cac nut la
Chng 6 e quy
Giao trnh Cau truc d lieu va Giai thuat 129
uoc dI ma chung fa chon so Ia mof frong cac canh xuaf phaf fu goc cay.
Chung fa dung ham Iuong gIa fhoo cach nhn cua nguoI choI so fhuc hIon buoc dI
nay. CIa su goI do Ia nguoI fhu nhaf, nguoI nay so chon con so Ion nhaf co fho.
TaI buoc ko, nguoI choI fhu haI IaI chon con so nho nhaf co fho, va cu fho fIop
fuc. o ham Iuong gIa duoc fnh fhoo cac fIou ch danh cho nguoI fhu nhaf, non
gIa frj nho nhaf cua no fuong ung fnh huong xau nhaf cua nguoI fhu nhaf. CIa
frj nay Iuon duoc nguoI fhu haI chon v fhoo khuynh huong fnh huong xau nhaf
doI voI nguoI fhu nhaf chnh Ia fnh huong fof nhaf cua nguoI fhu haI.ang cach
dI nguoc fu cac nuf Ia Ion, chung fa co fho gan cac frj cho moI nuf frong cay.
Chung fa hay fhuc hIon vIoc nay cho mof phan cua cay frong hnh 6.14, baf dau
fu canh bon fraI nhaf cua cay. Nuf dau fIon chua co nhan Ia nuf fron nam ngay
fron nuf hnh vuong mang so 10. o khong co su Iua chon nao khac fu nuf nay
non no cung co so 10. Nuf cha cua no co haI nuf con mang so 5 va 10. Nuf cha
nay fhuoc muc fhu ba frong cay non bIou dIon buoc dI cua nguoI fhu nhaf, do Ia
nguoI uu fIon chon so Ion. Vay nguoI nay da chon 10 non nuf cha nay cung so
mang frj 10.
Chung fa fIop fuc chuyon Ion muc fron. O day nuf cha co ba nuf con, con fhu
nhaf fu fraI sang Ia 10, con fhu haI Ia 7, con fhu ba Ia so Ion duoc chon ra fu 3 va
8 non Ia 8. ay Ia muc choI cua nguo I fhu haI, do do frj nho nhaf frong ba frj
fron duoc chon, do Ia 7. Cu nhu fho, nou fIop fuc chung fa so co duoc cay o hnh
6.15. Trj cua vj fr hIon faI nay Ia 7, va nguoI choI hIon faI, Ia nguoI choI fhu
nhaf fhoo hnh vo, so chon canh bon fraI nhaf cua vj fr hIon faI nay.

Trong vIoc danh gIa cay fro choI nay, chung fa da Iuan phIon chon so nho
nhaf |minima) va so Ion nhaf |maxima). o do qua frnh nay con goI Ia phuong
phap minimax.

HInh 6.15 Iuong gIa fhoo phuong phap MInImax cho cay fro choI
Chng 6 e quy
Giao trnh Cau truc d lieu va Giai thuat 130
6.4.3. Phut tren gu thuut
Chung fa so xom xof bang cach nao ma phuong phap minimax co fho duoc
Iong frong mof gIaI fhuaf hnh fhuc do du doan fruoc frong cac chuong frnh fro
choI. Chung fa so vIof mof gIaI fhuaf fong quaf do co fho su dung frong baf ky
mof fro choI nao co haI nguoI choI.

Chuong frnh so can fruy xuaf don fhong fIn vo mof fro choI cu fho nao do ma
chung fa muon choI. Chung fa gIa su rang fhong fIn nay duoc fap hop frong hIon
fhuc cua haI Iop goI Ia Move va Board. Mof doI fuong cua Iop Move bIou dIon mot
buoc d cuu tro cho, va mof doI fuong cua Iop Board bIou dIon mot tInh
huong cuu tro cho. Sau nay chung fa so hIon fhuc cac phIon ban cua haI Iop
fron day cho fro choI Tic-Tac-Toc.

oI voI Iop Move, chung fa chI can phuong fhuc constructor. mof constructor do
fao doI fuong Move fhoo y cua nguoI choI, va mof constructor khac do fao mof doI
fuong Move rong. Chung fa cung gIa su rang cac doI fuong cua Iop Move va Iop
Boar d dou co fho duoc goI bang fham frj cho ham cung nhu co fho duoc su dung
phop gan mof cach an foan, do do chung fa can vIof day du foan fu gan djnh
nghIa IaI |oocr/oaJcJ assignmcnt opcrator) va copy constructor cho ca haI Iop.

oI voI Iop Board, cac phuong fhuc can co Ia: khoI fao doI fuong, kIom fra fro
choI da kof fhuc hay chua, fIon hanh mof buoc dI nhan duoc qua fham frj, danh
gIa mof fnh huong, va cung cap mof danh sach cac nuoc dI hop Io hIon faI.

Phuong fhuc legal_moves, fra vo cac nuoc dI hop Io hIon faI, so can mof
danh sach cac fhong so do fnh foan cac kof qua. Chung fa can mof su Iua chon
gIua cac hIon fhuc cua cau fruc du IIou IIsf do chua cac cach dI nay. Trong vIoc
nhn foI fruoc, fhu fu gIua cac cach dI ma chung fa so khao saf Ia khong quan
frong, do do chung co fho duoc Iuu frong baf ky dang nao cua IIsf. o don gIan
cho vIoc Iap frnh, chung fa so su dung ngan xop. Phan fu cua ngan xop so Ia cac
doI fuong Move. Chung fa can djnh nghIa:

t ypedef Move St ack_ent r y;

Chung fa can fhom haI phuong fhuc do ho fro frong vIoc Iua chon nuoc dI fof
nhaf frong so cac nuoc dI hop Io. Phuong fhuc dau fIon, goI Ia better, su dung
haI fhong so Ia haI so nguyon va fra vo mof kof qua khac 0 nou nguoI choI chon
nuoc dI fhoo fhong so fhu nhaf, hoac bang 0 nou nguoI choI chon nuoc dI fhoo
fhong so fhu haI. Phuong fhuc fhu haI, goI Ia worst_case, fra vo mof hang so
duoc xac djnh fruoc co frj fhap hon faf ca cac frj ma ham Iuong gIa fnh duoc
frong qua frnh nhn fruoc.

Chng 6 e quy
Giao trnh Cau truc d lieu va Giai thuat 131
Chung fa co djnh nghIa cua Iop Boar d nhu sau:
cl ass Board {
publ i c:
Boar d( ) ; / / const r uct or khoI fao frang fhaI ban dau fhch hop doI voI moI fro choI.
i nt done( ) const ; / / kIom fra xom fro choI da kof fhuc hay chua.
voi d pl ay( Move t r y_i t ) ;
i nt eval uat e( ) const ;
i nt l egal _moves( St ack &moves) const ;
i nt wor st _case( ) const ;
i nt bet t er ( i nt val ue, i nt ol d_val ue) const ; / / chon nuoc dI fof nhaf.
voi d pr i nt ( ) const ;
voi d i nst r uct i ons( ) const ;
/ * Cac phuong fhuc, ham va du IIou bo sung fuy fung fro choI cu fho */
};
oI fuong Boar d can Iuu mof fnh huong cua fro choI va nguoI ma sap fhuc
hIon buoc dI.

Truoc khI vIof ham nhn fruoc do danh gIa cay fro choI, chung fa can chon ra
so buoc ma gIaI fhuaf nhn fruoc so phaI khao saf. oI voI mof fro choI fuong doI
phuc fap, chung fa can djnh ra do sau |depth) so duoc nhn fruoc, cac muc bon
duoI nua so khong duoc xof don. Mof dIou kIon dung khac cua vIoc nhn fruoc
chnh Ia khI fro choI kof fhuc, do Ia Iuc ma phuong fhuc done cua Boar d fra vo
t r ue. NhIom vu chnh cua vIoc nhn fruoc frong cay co fho duoc mo fa boI gIaI
fhuaf do quy sau day:
6.4.4. Tnh che
Chuong frnh cu fho cua gIaI fhuaf fron nhu sau:
int look_ahead(const Board &game, int depth, Move &recommended)
/ *
pre: doI fuong Boar d bIou dIon mof fnh huong hop Io cua fro choI.
post: cac nuoc dI cua fro choI duoc nhn fruoc voI do sau Ia dept h, nuoc dI fof nhaf duoc chI ra
frong fham bIon r ecommended.
uses: cac Iop St ack, Boar d, va Move, cung voI ham l ook_ahead mof cach do quy.
*/
Algorithm look_ahead |fhong so Ia mof doI fuong Board);
1. if do quy dung |do sau depth == 0 hoac game. done( ) )
1. return frj Iuong gIa cua fnh huong
2. else
1. for moI nuoc dI Move hop Io
1. fao mof doI fuong Board moI bang cach fhuc hIon nuoc dI Move.
2. goI do quy look_ahead fuong ung voI su Iua chon fof nhaf cua
nguoI choI ko fIop;
2. Chon cach dI fof nhaf cho nguoI choI frong so cac cach dI fm duoc
frong vong Iap fron;
3. return doI fuong Move fuong ung va frj;
Chng 6 e quy
Giao trnh Cau truc d lieu va Giai thuat 132
{
i f ( game. done( ) | | dept h == 0)
r et ur n game. eval uat e( ) ;
el se {
St ack moves;
game. l egal _moves( moves) ;
i nt val ue, best _val ue = game. wor st _case( ) ;

whi l e ( ! moves. empt y( ) ) {
Move t r y_i t , r epl y;
moves. t op( t r y_i t ) ;
Boar d new_game = game;
new_game. pl ay( t r y_i t ) ;
val ue = l ook_ahead( new_game, dept h - 1, r epl y) ;
i f ( game. bet t er ( val ue, best _val ue) ) { / / nuoc dI fhu t r y_i t vua roI hIon
Ia fof nhaf.
best _val ue = val ue;
r ecommended = t r y_i t ;
}
moves. pop( ) ;
}
r et ur n best _val ue;
}
}

Tham bIon recommended so nhan vo mof nuoc dI duoc fIon cu |fru khI do quy
roI vao dIom dung, do Ia khI fro choI kof fhuc hoac do sau cua vIoc nhn fruoc
depth bang 0). o chung fa khong muon doI fuong game bj fhay doI frong ham, dong fhoI do
franh vIoc chop IaI maf fhoI gIan, no duoc goI cho ham bang fham chIou hang. Chung fa cung Iuu
y rang vIoc khaI bao fham chIou hang nay chI hop Io khI doI fuong game frong ham chI fhuc hIon
cac phuong fhuc da duoc khaI bao const frong djnh nghIa cua Iop Board.
6.4.5. Tc-Tuc-Toe
Nhu fron da noI, ham do quy look_ahead cung haI Iop Board va Move fron
day fuy raf don gIan, nhung no IaI Ia cof IoI frong cac chuong frnh bIou dIon fro
choI co haI doI fhu. Chung fa so frIon khaI phac fhao nay frong fro choI tic-tac-toc
raf quon fhuoc. o Iam duoc dIou nay, ca haI Iop so chua fhom mof f du IIou khac
so voI hIon fhuc hnh fhuc ban dau.

VIoc vIof chuong frnh chnh hoan faf cung ham l ook_ahead cho fro choI tic-
tac-toc duoc danh IaI nhu baI fap. Chuong frnh co fho chua fhom nhIou chuc
nang nhu cho phop nguoI choI voI may, dua ra cac phan fch day du cho moI fnh
huong, cung cap chuc nang cho haI nguoI choI voI nhau, danh gIa cac buoc dI cua
haI doI fhu,...

Chung fa bIou dIon IuoI fro choI tic-tac-toc bang mof mang 3x3 cac so nguyon,
o co frj 0 Ia o frong, frj 1 va 2 bIou dIon nuoc dI cua nguoI fhu nhaf va fhu haI
fuong ung.

Chng 6 e quy
Giao trnh Cau truc d lieu va Giai thuat 133
Trong doI fuong Move, chung fa chua foa do cac o fron IuoI. Mof nuoc dI hop Io
chua foa do co cac frj fu 0 don 2. Chung fa khong can don fnh dong kn cua doI
fuong Move v no chI nhu mof vaf chua do chua cac gIa frj.

/ / Iop move cho fro choI tic-tac-toe
class Move {
publ i c:
Move( ) ;
Move( i nt r , i nt c) ;
i nt r ow;
i nt col ;
};

Move: : Move( )
/ *
post: doI fuong Move duoc khoI fao boI frj mac djnh khong hop Io.
*/
{
r ow = 3;
col = 3;
}

Move: : Move(int r, int c)
/ *
post: doI fuong Move duoc khoI fao boI foa do cho fruoc.
*/
{
r ow = r ;
col = c;
}

Iop Board can mof constructor do khoI fao fro choI, phuong fhuc print va
instruction |In cac fhong fIn cho nguoI choI), phuong fhuc done, play va
legal_moves |hIon fhuc cac quy fac choI), va cac phuong fhuc evaluate,
better, va worst_case |phan doan dIom cho cac nuoc dI khac nhau). Chung fa
con co fho bo sung ham phu fro the_winner cho bIof rang fro choI da co nguoI
fhang chua va nguoI fhang Ia aI.

Iop Board can chua fhong fIn vo frang fhaI hIon faI cua fro choI frong mang
3x3 va fong so buoc dI da fhuc hIon. Chung fa co Iop Board nhu sau:


class Board {
publ i c:
Boar d( ) ;
bool done( ) const ;
voi d pr i nt ( ) const ;
voi d i nst r uct i ons( ) const ;
bool bet t er ( i nt val ue, i nt ol d_val ue) const ;
voi d pl ay( Move t r y_i t ) ;
i nt wor st _case( ) const ;
Chng 6 e quy
Giao trnh Cau truc d lieu va Giai thuat 134
i nt eval uat e( ) const ;
i nt l egal _moves( St ack &moves) const ;
pr i vat e:
i nt squares[ 3] [ 3] ;
i nt moves_done;
i nt t he_wi nner ( ) const ;
};

Constructor don gIan chI Iam mof vIoc Ia khoI fao faf ca cac o cua mang Ia 0
do chI rang ca haI nguoI choI dou chua dI nuoc nao.

Boar d: : Board( )
/ *
post: doI fuong Boar d duoc khoI fao rong fuong ung frang fhaI ban dau cua fro choI.
*/
{
f or ( i nt i = 0; i < 3; i ++)
f or ( i nt j = 0; j < 3; j ++)
squar es[ i ] [ j ] = 0;
moves_done = 0;
}

Chung fa danh cac phuong fhuc In cac fhong fIn cho nguoI choI nhu Ia baI fap.
Thay vao do, chung fa fap frung vao cac phuong fhuc IIon quan don cac quy fac
cua fro choI. o fhuc hIon mof nuoc dI, chung fa chI can gan IaI frj cho mof o va
fang bIon dom moves_done Ion 1. ua vao bIon dom nay chung fa con bIof duoc
don Iuof nguoI nao dI.

voi d Boar d: : play( Move t r y_i t )
/ *
post: nuoc dI t r y_i t duoc fhuc hIon
*/
{
squar es[ t r y_i t . r ow] [ t r y_i t . col ] = moves_done %2 + 1;
moves_done++;
}

Ham phu fro the_winner fra vo mof so khac khong nou da co nguoI fhang.

i nt Boar d: : the_winner( ) const
/ *
post: fra vo 0 nou chua aI fhang; 1 nou nguoI fhu nhaf fhang; 2 nou nguoI fhu haI fhang.
*/
{
i nt i ;
f or ( i = 0; i < 3; i ++)
i f ( squar es[ i ] [ 0] && squar es[ i ] [ 0] == squar es[ i ] [ 1]
&& squar es[ i ] [ 0] == squar es[ i ] [ 2] )
r et ur n squar es[ i ] [ 0] ;

f or ( i = 0; i < 3; i ++)
i f ( squar es[ 0] [ i ] && squar es[ 0] [ i ] == squar es[ 1] [ i ]
&& squar es[ 0] [ i ] == squar es[ 2] [ i ] )
r et ur n squar es[ 0] [ i ] ;
Chng 6 e quy
Giao trnh Cau truc d lieu va Giai thuat 135


i f ( squar es[ 0] [ 0] && squar es[ 0] [ 0] == squar es[ 1] [ 1]
&& squar es[ 0] [ 0] == squar es[ 2] [ 2] )
r et ur n squar es[ 0] [ 0] ;

i f ( squar es[ 0] [ 2] && squar es[ 0] [ 2] == squar es[ 1] [ 1]
&& squar es[ 2] [ 0] == squar es[ 0] [ 2] )
r et ur n squar es[ 0] [ 2] ;
r et ur n 0;
}

Tro chi ket thuc sau 9 nc i hoac khi co ngi thang. (Chng trnh cua chung ta khong
phat hien sm kha nang hoa trc khi ket thuc 9 nc i).

bool Boar d: : done( ) const
/ *
post: fra vo t r ue nou fro choI da phan fhang baI hoac ca 9 o fron ban co da duoc danh dau,
nguoc IaI fra vo f al se.
*/
{
r et ur n moves_done == 9 | | t he_wi nner ( ) > 0;
}

Trong fro choI don gIan nay, nuoc dI hop Io Ia nhung o mang frj 0.

i nt Boar d: : legal_moves( St ack &moves) const
/ *
post: Thong so moves chua cac nuoc dI hop Io.
*/
{
i nt count = 0;
whi l e ( ! moves. empt y( ) ) moves. pop( ) ;
f or ( i nt i = 0; i < 3; i ++)
f or ( i nt j = 0; j < 3; j ++)
i f ( squar es[ i ] [ j ] == 0) {
Move can_pl ay( i , j ) ;
moves. push( can_pl ay) ;
count ++;
}
r et ur n count ;
}

Chung fa chuyon sang cac phuong fhuc co fho cho nhung su danh gIa vo mof
fnh huong cua fro choI hoac cua mof nuoc dI co fho xay ra. Chung fa so baf dau
danh gIa mof fnh huong cua fro choI Ia 0 frong fruong hop chua co nguoI nao
fhang. Nou mof frong haI nguoI fhang, chung fa so danh gIa fnh huong dua vao
quy fac: cang fhang nhanh fh cang hay. Iou nay cung dong nghIa voI vIoc cang
fhua nhanh fh cang do. Nou moves_done Ia so nuoc dI ca haI nguoI choI da fhuc
hIon fh |10- moves_done) cang Ion khI so nuoc da dI cang nho, fuong ung su
danh gIa cao khI nguoI fhu nhaf som fhang. Nguoc IaI, nou nguoI fhu haI fhang
fh chung fa dung frj |moves_done- 10) , so nuoc dI cang nho fh frj nay Ia mof
so cang am, fuong ung vIoc fhua nhanh chong cua nguoI fhu nhaf Ia raf do.
Chng 6 e quy
Giao trnh Cau truc d lieu va Giai thuat 136
I nhIon rang, cach danh gIa nay chI duoc ap Ion dIom cuoI cua vIoc nhn
fruoc |o do sau mong muon hoac khI fro choI da phan fhang baI). Trong phan Ion
cac fnh huong, nou chung fa nhn fruoc cang xa fh ban chaf chua fInh cua cach
danh gIa so do gay hau qua xau hon.

i nt Boar d: : evaluate( ) const
/ *
post: fra vo 0 khI chua co nguoI fhang cuoc; hoac 1 so duong fu 1 don 9 frong fruong hop nguoI
fhu nhaf fhang, nguoc IaI Ia mof so am fu 1 don 9 frong fruong hop nguoI fhu haI
fhang.
*/
{
i nt wi nner = t he_wi nner ( ) ;
i f ( wi nner == 1) r et ur n 10 - moves_done;
el se i f ( wi nner == 2) r et ur n moves_done - 10;
el se r et ur n 0;
}

Phuong fhuc worst_case co fho chI don gIan fra vo mof frong haI frj 10 hoac
-10, do evaluate Iuon fra mof frj nam gIua -9 va 9. Tu do, phuong fhuc so sanh
better chI can so sanh mof cap so nguyon co frj nam gIua -10 va 10. Cac phuong
fhuc nay xom nhu baI fap.

CIo fh chung fa da phac fhao xong phan Ion chuong frnh fro choI tic-tac-toc.
Mof chuong frnh Iay do sau cho vIoc nhn fruoc Ia 9 so choI fof do chung fa Iuon
co fho nhn fruoc don mof fnh huong ma su danh gIa vo no Ia chnh xac. Mof
chuong frnh nhn fruoc voI mof do sau khong Ion co fho mac phaI saI Iam, do no
co fho kof fhuc vIoc nhn fruoc boI fap cac fnh huong co frj danh gIa bang 0 mof
cach nham Ian.

You might also like