Bai Toan Thap Ha Noi Theo de Quy

download Bai Toan Thap Ha Noi Theo de Quy

of 15

Transcript of Bai Toan Thap Ha Noi Theo de Quy

T sa hon thin c g cha ng th bo li nh :D,nu hp l ri th rp li lun nhP/S:Nhng on khai bo vd int n; th in m ch int n; s trc quan v d nhn hn Font Time New Roman size 14

Bi bo co c s dng cc ti liu: - Slide K thut lp trnh ca thy Lng Mnh B -Sch Cu Trc D Liu ca TS.Nguyn Vn Linh - Wikipedia.org 2.BI TON THP H NI 2.1 BI Bi ton "thp H Ni" c pht biu nh sau: C ba cc A,B,C. Khi u cc A c mt s a xp theo th t nh dn ln trn nh. Bi ton t ra l phi chuyn ton b chng a t A sang B. Mi ln thc hin chuyn mt a t mt cc sang mt cc khc v khng c t a ln nm trn a nh .

2.2. GII THIU BI TON 2.2.1 Lch s Tr chi Thp H Ni c th xut hin ng t th k 19 hoc trc . Cc a c lm bng s Trung Quc, Nht Bn v Vit Nam. Tr chi ny c a sang phng Ty ln u bi nh ton hc ngi Php Edouard Lucasvo nm 1883. Tr chi ny nhanh chng c cc nh ton hc nghin cu sau , v tr thnh v d v phng php gii quy kinh in trong dy hc v tin hc.

2.2 Cc yu cu - Module ha: s dng cc phng php ch gii hp l - Vit ch gii hp ly - Dng quy v kh quy - Vit trn C/C++

2.3 Phng php gii 2.3.1 Gii bi ton bng phng php quy 2.3.1.1 M t phng php t tn cc cc l A, B, C -- nhng tn ny c th chuyn cc bc khc nhau ( y: A = Cc Ngun, B = Cc ch, C = Cc Trung Gian) gi n l tng s a nh s a t 1 (nh nht, trn cng) n n (ln nht, di cng) chuyn n a t cc A sang cc B th cn: 1.Chuyn n-1 a t A sang C. Ch cn li a th n trn cc A 2.Chuyn a th n t A sang B 3.Chuyn n-1 a t C sang B cho chng nm trn a th n tin hnh bc 1 v 3, p dng li thut gii cho n-1. Ton b qu trnh l mt s hu hn cc bc, v n mt lc no thut gii s p dng cho n = 1. 2.3.1.2 M ngun chng trnh

#include #include void Move (int, char, char, char); int i=0; /*-------------CHNG TRNH CON MOVE QUY ----------------------------------------------------*/

void Move(int n, char CotNguon, char CotDich, char CotTG ) { if ( n == 1){ printf("dich chuyen dia tu %c toi %c\n",CotNguon,CotDich); i++; return; } else { Move(n-1, CotNguon, CotTG, CotDich); Move(1,CotNguon,CotDich,CotTG); Move(n-1, CotTG, CotDich, CotNguon); } } /*--------------------------HM MAIN ------------------------------*/ int main() { int sodia; printf(" Hay nhap so dia : " ); scanf("%d",&sodia); Move (sodia,'A','C','B'); printf(" tong so cach dich chuyen la %d\n " , i); getch();

}

2.4.2.3 Kt qu chy chng trnh 1.S a = 2

2.S a =3

3.So dia = 4

4.So dia =5

5.So dia =6

2.1.2 Phng php kh quy (dng ngn xp) 2.1.2.1:M t phng php: kh qui ta phi nm nguyn tc sau y: Mi khi chng trnh con qui c gi, ng vi vic i t mc i vo mc i+1, ta phi lu tr cc bin cc b ca chng trnh con bc i vo ngn xp. Ta cng phi lu "a ch m lnh" cha c thi hnh ca chng trnh con mc i. Tuy nhin khi lp trnh bng ngn ng cp cao th y khng phi l a ch nh cha m lnh ca my m ta s t chc sao cho khi mc i+1 hon thnh th lnh tip theo s c thc hin l lnh u tin cha c thi hnh trong mc i. Tp hp cc bin cc b ca mi ln gi chng trnh con xem nh l mt mu tin hot ng (activation record). Mi ln thc hin chng trnh con ti mc i th phi xo mu tin lu cc bin cc b mc ny trong ngn xp. Nh vy nu ta t chc ngn xp hp l th cc gi tr trong ngn xp chng nhng lu tr c cc bin cc b cho mi ln gi qui, m cn "iu khin c th t tr v" ca cc chng trnh con. tng ny th hin trong ci t kh qui cho bi ton thp H Ni l: mu tin lu tr cc bin cc b ca chng trnh con thc hin sau th c a vo ngn xp trc n c ly ra dng sau.

2.1.2.2 : M ngun chng trnh : /************************************************************* *CHNG TRNH GII BI TON THP H NI KHNG QUY** *************************************************************/ #include #include #include #define Max 100

//Kiu cu trc lu bin cc b typedef struct{ int N; char A,B,C; }ElementType; typedef struct { ElementType e[Max]; int top; }stack;

//To mt ngn xp rng void Creat_stack(stack *ps) { ps->top=Max; } //Kim tra danh sch rng int Empty(stack ps) { return ps.top==Max; } //Kim tra danh sch y int Full(stack ps) { return ps.top==0;

} //th tc a vo void Push(stack *ps,ElementType x){ if(Full(*ps)) printf("\nwarning:ngan xep da day"); else { ps->top--; ps->e[ps->top]=x; } } //th tc ly ra void Pop(stack *ps){ if(Empty(*ps)) printf("\nerro:ngan xep rong"); else{ ps->top++; } } //hm tr v ni dung phn t ti nh ngn xp,nu ngn xp rng th thng bo li ElementType Top(stack ps){ if(!Empty(ps)) return ps.e[ps.top]; else printf("\nerro:Empty Stack"); }

/*------------------------CHNG TRNH CON MOVE KHNG QUY -------------------------*/ int Move(ElementType X){ ElementType Temp,Temp1; stack S; int count =0; //Khai bo bin m s ln chuyn Creat_stack(&S); Push(&S,X); do{ Temp=Top(S); //Ly phn t u Pop(&S); //xa phn t u if(Temp.N==1) { printf("\nChuyen dia tu %c sang %c",Temp.A,Temp.B); count++; } else{ //Lu li gi cho Move(n-1,C,B,A) Temp1.N=Temp.N-1; Temp1.A=Temp.C; Temp1.B=Temp.B; Temp1.C=Temp.A; Push(&S,Temp1);

//Lu li gi cho Move(1,A,B,C) Temp1.N=1; Temp1.A=Temp.A; Temp1.B=Temp.B; Temp1.C=Temp.C; Push(&S,Temp1);

//Lu li gi cho Move(N-1,A,C,B) Temp1.N=Temp.N-1; Temp1.A=Temp.A; Temp1.B=Temp.C; Temp1.C=Temp.B; Push(&S,Temp1); } }while(!Empty(S)); return (count); }

/*-----------------------HM MAIN ---------------------------*/ int main() { int N,count;

ElementType X; printf("\n****Chao Mung Den Voi Thuat Toan Thap Hanoi****\n"); //Yu cu nhp s a printf ("\nNhap so dia : "); scanf ("%d",&N); //Gn cc gi tr ca bi ton cho bin cc b X.N=N; X.A='A'; X.B='B'; X.C='C'; count = Move(X); printf("\n"); printf("\nTong so lan phai chuyen la %d",count); printf("\n"); getch(); return 0; } //Ht chng trnh.

2.1.2.3 Cc kt qu minh ha : 1. Vi s a N=1,ch cn 1 ln chuyn a t AB l xong .

2. Vi s a N=2,ta cn ti 3 ln chuyn .

3. Vi s a N=3,ta cn 7 ln chuyn .

4.Vi s a N=4,ta cn 15 ln chuyn .

5. Vi s a N=5, bt u phc tp,ta cn 31 ln chuyn .

6.Vi s a N=6, ta cn ti 63 ln chuyn .

7.Vi s a N=10,lc ny ta cn ti 1023 ln chuyn.

*P/S:S ln chuyn vi N a l 2^N-1. 2.5.NHN XT V 2 THUT TON Thc cht v thi gian chy chng trnh ca 2 thut ton quy v khng quy dung ngn xp l tng ng nhng c th thy thut ton quy c cch vit ngn gn ,d hiu v khoa hc hn.Thit ngh nn s dng thut ton quy gii bi ton ny s hiu qu hn.