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:
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:
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.