Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 20 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
20
Dung lượng
155 KB
Nội dung
Giáo án bồi dưỡng 12 Tuần:……… Tiết PPCT:….… Ngày dạy:……/…./ 2008 CHUYÊN ĐỀ: THUẬT TOÁN ĐỆ QUI I/ NỘI DUNG 1/ MÔ HÌNH CỦA THUẬT TOÁN QUAY LUI Thuật toán quay lui dùng để giải toán liệt kê cấu hình Mỗi cấu hình xây dựng cách xây dựng phần tử, phần tử chọn cách thử tất khả Giả thiết cấu hình cần liệt kê có dạng (x 1,x2,……,xn) thuật toán quay lui thực qua bước sau: 1) Xét tất giá trị x nhận, thử cho x nhận giá trị Với giá trị thử gán chon x1 ta sẽ: 2) Xét tất giá trị x nhận, lại thử cho x nhận giá trị Với giá trị thử gán cho x2 lại xét tiếp khả chọn x .cứ tiếp tục đến bước n) Xét tất giá trị xn nhận, thử cho xn nhận giá trị đó, thông báo cấu hình tìm (x1,x2,……,xn) Trên phương diện quy nạp, nói thuật toán quay lui liệt kê cấu hình n phần tử dạng (x1,x2,……,xn) cách thử cho x1 nhận giá trị Với giá trị thử gán cho x1 lại liệt kê tiếp cấu hình n-1 phần tử (x2,x3,……,xn) Mô hình thuật toán quay lui mô tả sau: (Thủ tục thử cho xi nhận giá trị mà nhận) Procedure Try(i:Integer); Begin For (mọi giá trị V gán cho xi) Begin if (xi phần tử cuối cấu hình) then Else Begin ; Try(i+1);(Gọi đệ qui để chọn tiếp xi+1) ; End; End; End; Thuật toán quay lui bắt đầu lời gọi Try(1) Trang Giáo án bồi dưỡng 12 Ta trình bày trình tìm kiếm lời giải thuật toán quay lui thuật toán quay lui sau: Try(1 ) Try(2 ) Try(3 ) Try(2 ) Try(3 ) Try(3 ) 2/ MỘT SỐ VÍ DỤ Try(3 ) Hình 1: Cây tìm kiếm quay lui Ví dụ 1: Liệt kê dãy nhị phân độ dài n Biểu diễn dãy nhị phân độ dài N dạng (x 1,x2,……,xn) Ta liệt kê dãy cách thử dùng giá trị (0,1) gán cho x i Với giá trị thử gán cho xi lại thử giá trị gán cho xi+1 Chương trình liệt kê thuật toán quay lui Giải: Trang Giáo án bồi dưỡng 12 Program BinaryStrings; Uses crt; Const Max=30; input='BSTR.INP'; output='BSTR.OUT'; Var x: Array[1 max] of integer; n:Integer; f,g:text; Procedure PrintResult ; Var I:Integer; Begin For i:=1 to n write(g,x[i]); writeln(g); End; Procedure Try(i:integer); Var J:integer; Begin For j:=0 to Begin x[i]:=j; if i=n then PrintResult else Try(i+1); End; End; BEGIN Clrscr; Assign(F,Input); Assign(g,output);Rewrite(g); Reset(f); Read(f,n); Try(1); Close(f); Close(g); Readln; END Ví dụ 2: Liệt kê tập k phần tử Để liệt kê tập k phần tử tập S=(1,2,……,n) ta đưa liệt kê cấu hình (x1,x2,….,xk) xi S x1u=x-1; v=y-1 - Dùng ma trận A để đánh dấu cột,dòng qua: A[dòng,cột]=1 chưa qua A[dòng,cột]=0 - Dùng mảng lưu để lưu trữ dòng cột vừa qua Chương trình: Nếu qua đủ NxN (k=N*N) ô bàn cờ in cách Ngược lại: For j:=1 đến laøm + U:=x+a1[j]( a1:array[1 3] of Integer=(1,0,-1);) + V:=y+b1[j]( b1:array[1 3] Of Integer=(0,1,-1);) + Nếu u,v nằm bàn cờ + Lưu giữ lại u,v + Đánh dấu dòng u, cột v qua: A[u,v]:=1 + Xét ô(u,v) với ô lại Trang 16 Chuyên đề: Thuật toán đệ qui quay lui + Nếu không tìm đường hay tìm đường đi, quay lại để tìm đường khác Procedure Try(X,Y,k:byte); Var U,V,J:Byte; Begin If K=sqr(N)+1 then Print Else For J:=1 to Begin U:=X+A1[j];V:=Y+B1[j]; If (U in Th) and (V in th) then {Th=[1 N]} If A[u,v]=0 then Begin A[u,v]:=1; Luu[k].x:=U; Luu[k].y:=V; Try(U,V,k+1); A[u,v]:=0; End; End; End; Bài 12: Công việc Có N người N công việc Gọi cij công sức làm việc j người i lập chương trình dể xếp người công việc cho công sức bỏ Chon[j]:=False; Procedure Output; End; Var J:byte; End; Begin If tong