Đệ qui quay lui và phương pháp nhánh cận

9 3.1K 106
Đệ qui quay lui và phương pháp nhánh cận

Đang tải... (xem toàn văn)

Thông tin tài liệu

Đệ qui quay lui và phương pháp nhánh cận

Đệ qui quay lui phương pháp nhánh cậnTrần Đình HưngBàitoán "Tháp Hà Nội" là một bài toán cơ bản của thuật toán đệ qui. Bài toán phátbiểu đơn giản như sau: Cho 3 cọc A, B, C, cọc A chứa N đĩa với qui tắc trên nhỏdưới to, mỗi lần chuyển chỉ được chuyển 1 đĩa từ cọc này sang 1 trong 2 cọc cònlại giữ nguyên trật tự to nhỏ, hãy đưa ra 1 cách chuyển N đĩa từ AC. Trong bài toán này ta có thể xử lí một cách dễ dàng qua 3 lời gọi đệqui:Procedure Chuyen(N, A, B, C: Byte);BeginIf N=1 Then Write(Chr(A+64 ),' =>',Chr(C+64))ElseBeginChuyen(N-1,A,B,C);Chuyen(1,A,C,B);Chuyen(N-1,B,C,A);end;End;Chươngtrình chính chỉ cần gọi: Chuyen(N,1,3,2);Tuynhiên vấn đề đặt ra ở đây rắc rối hơn: Cho 3 cọc A, B, C xếp trên 1 vòng trònlần lượt là A, B, C chỉ được chuyển theo chiều kim đồng hồ A =>B=>C=>A.Chúngta sẽ giải quyết bài toán bằng hai thủ tục đệ qui thủ tục này gọi thủ tụckia thông qua từ khoá Forward của Turbo Pascal. Tư tưởng thuật toán như sau: Để chuyển N đĩa từ A sang Cta chuyển N-1 đĩa từ A sang C với thủ tụcChuyen2, chuyển 1 đĩa từ A sang B (Chuyen1),chuyển N-1 đĩa từ C sang A (Chuyen1),chuyển 1 đĩa từ B sang C (Chuyen1),chuyển N-1 đĩa từ A sang C (Chuyen2).Nhưvậy có hai thủ tục: Chuyển A sang C chuyển C sang A.Dữliệu ra được ghi trong file text "Kq.dat".Vídụ: A => BB => C .Cấutrúc file rất đơn giản để tiết kiệm không gian đĩa, khi cho số đĩa chuyển lớn.Program Chuyen_Dia;Uses Crt;Var N:Byte;F:Text;T:LongInt Absolute 0:$46C;T1,T2,Dem:LongInt;Procedure Chuyen1(N,C,A,B:Byte);Forward;Procedure Khoi_Tao;BeginWrite('Vao N:');Readln(N);Assign(F,'Kq.Dat');ReWrite(F);Dem:=0;End;Procedure Chuyen2(N,A,C,B:Byte); BeginIf N=1 ThenbeginWriteln(F,Chr(A+64),'->',Chr(B+64));Writeln(F,Chr(B+64),'->',Chr(C+64));Dem:=Dem+2;endElseBeginChuyen2(N-1,A,C,B);Chuyen1(1,A,B,C);Chuyen1(N-1,C,A,B);Chuyen1(1,B,C,A);Chuyen2(N-1,A,C,B);End;End;Procedure Chuyen1(N,C,A,B:Byte);BeginIf N=1 ThenbeginWriteln(F,Chr(C+64),'->',Chr(A+64));Dem:=Dem+1;end ElseBeginChuyen2(N-1,C,B,A);Chuyen1(1,C,A,B);Chuyen2(N-1,B,A,C);end;End;Procedure Thuc_Hien;BeginT1:=T;Chuyen2(N,1,3,2);T2:=T;Writeln('Thoi gian chaychuong trinh la:',(T2-T1)/18.2:10:10,' Giaý);Write(F,'So lanchuyen:',Dem);Write('So lanchuyen:',Dem);Close(F);Readln;End;BEGINClrscr;Khoi_Tao;Thuc_Hien;END. Tương tự ta có thể viết chương trình cho cách chuyển từ Asang B.Procedure Chuyen1(N,A,B,C:Byte);BeginIf N=1 ThenBeginWriteln(F,Chr(A+64),'->',Chr(B+64));Dem:= Dem+1;endElseBeginChuyen2(N-1,A,C,B);Chuyen1(1,A,B,C);Chuyen2(N-1,C,B,A);end;End;Procedure Chuyen2(N,A,C,B:Byte);BeginIf N=1 ThenBeginWriteln(F,Chr(A+64),'->',Chr(B+64));Writeln(F,Chr(B+64),'->',Chr(C+64));Dem:=Dem+2;end ElseBeginChuyen2(N-1,A,C,B);Chuyen1(1,A,B,C);Chuyen1(N-1,C,A,B);Chuyen1(1,B,C,A);Chuyen2(N-1,A,C,B);end;End;Chương trình chính chỉ cần gọi Chuyen1(N,1,2,3);Bàitoán tiếp theo tôi muốn đề cập là bài toán n chàng trai m cô gái đã được tácgiả Lê Thanh Hà giải quyết bằng luồng cực đại trong số 3-1999. Bài toán phátbiểu như sau: Cho n chàng trai m cô gái, mỗi chàng trai có mức độ tình cảmkhác nhau cho mỗi cô gái hãy đưa ra cách sắp các đôi sao cho mức độ tình cảm làcao nhất có thể được. Tôi giải quyết bằng phương pháp nhánh cận. Phươngpháp(PP) này không tối ưu về thời gian cũng như bộ nhớ bằng PP luồng cực đạinhưng dễ hiểu hơn. Văn bản chương trình viết bằng TP7 như sau.{$M 65000,0,0}Program Trai_Gai;Uses Crt;Var A:Array[1 100,1 100] Of Byte;B:Array[1 100] Of Boolean;C,D:Array[1 100] Of Byte;I,J,N,M:Integer;F:Text;T:LongInt Absolute 0:$46C; T1,T2:LongInt;CMax,Max:Integer;Procedure Khoi_Tao;BeginAssign(F,'Dl2.dat');Reset(F);Readln(F,N,M);For I:=1 ToN DoFor J:=1 ToM Do Read(F,A[I,J]);CMax:=0;For I:=1 ToN DoFor J:=1 ToM DoIfA[I,J]>CMax Then CMax:=A[I,J];FillChar(B,M,True);Fillchar(C,N,0);Close(F);Assign(F,'Kq1.Dat');ReWrite(F);Max:=0;End;Procedure Try(I:Byte;S:Integer);Var J:Byte;Begin If (I=N+1) And (S>Max) ThenBegin Max:=S;D:=C;End;For J:=1 To M DoIf (B[J]) And (A[I,J]>0) And(S+CMax*(N-I+1)>Max) ThenBeginB[J]:=False;C[I]:=J;S:=S+A[I,J];Try(I+1,S);B[J]:=True;S:=S-A[I,J];end;C[I]:=0;End;BEGINClrscr;T1:=T;Khoi_Tao;Try(1,0);T2:=T;Writeln('Thoi gian chay chuongtrinh:',(T2-T1)/18.2:10:10);For I:=1 To N DoWrite(F,I,':',D[I],' ');Write(F,"Muc do tinh cam lon nhat: ",Max); Readln;Close(F);END.Các bạn có thể nghiên cứu để phát triển thêm bài toán saocho tối ưu hơn. Chúc các bạn thành công. . Đệ qui quay lui và phương pháp nhánh cậnTrần Đình HưngBàitoán "Tháp Hà Nội" là một bài toán cơ bản của thuật toán đệ qui. Bài toán. cho mức độ tình cảm làcao nhất có thể được. Tôi giải quyết bằng phương pháp nhánh cận. Phươngpháp(PP) này không tối ưu về thời gian cũng như bộ nhớ bằng PP

Ngày đăng: 07/09/2012, 11:40

Từ khóa liên quan

Tài liệu cùng người dùng

Tài liệu liên quan