1. Trang chủ
  2. » Luận Văn - Báo Cáo

Thuat toan quay lui

3 5 0

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

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 3
Dung lượng 8,79 KB

Nội dung

Ta có thủ tục đệ quy sau đây: Procedure Try i:tinteger; Var j:integer; Begin For j:=1 to n do if chấp nhận j then begin xác nhận aj theo j if i=n then else tryi+1; end; end; Để minh hoạ [r]

(1)Thuật toán quay lui và ứng dụng Lã Văn Chinh Giả thiết cấu hình cần tìm mô tả phận gồm n thành phần a1, a2, an Giả sử tìm i - thành phần a1, a2, ai-1, ta tìm thành phần thứ i cách duyệt tất các khả có thể Với khả j kiểm tra xem nó có chấp nhận không Xảy rahai trường hợp nhận thì xác định theo j và kiểm tra xem i = n chưa, i = n thì ta ghi nhận cấu hình, còn i < ta gọi tiến hành xác định ai+1 Nếu thử tất các khả mà không có khả nào chấp nhận thì quay lại bước trước xác định lại ai-1 Nội dung thuật toán này phù hợp với việc gọi đệ quy Ta có thủ tục đệ quy sau đây: Procedure Try (i:tinteger); Var j:integer; Begin For j:=1 to n if chấp nhận j then begin xác nhận aj theo j if i=n then else try(i+1); end; end; Để minh hoạ cho thuật toán này ta áp dụng giải bài toán xếp hậu: Nội dung bài toán: Liệt kê tất các cách xếp hậu trên bàn cờ NxN cho chúng không ăn Giải: Ta xếp n hậu trên n dòng, heo nguyên lý nhân ta có nn cách xếp thoả mãn điều kiện đầu bải Để làm điều đó ta dùng thủ tục đệ quy mô tả trên để giải Ta đánh ghi số cột và dòng bàn cờ từ đến n, cách xếp ứng với gồm a1,a2, ,an với = j (j=1,2, ,n) có nghĩa là hậu thứ i đặt vào cột j Giả sử ta chọn i-1 hậu cách duyệt tất các khả nó Quan trọng là ta tìm điều kiện chấp nhận j, hậu đứng ô bàn cờ nó có nhiều bốn hướng đi(đường dọc, đường ngang và hai đường chéo) Vậy điều kiện chấp nhận thứ i thoả mãn không nằm trên đường tất i-1 hậu đã xếp Bởi vì n hậu xếp hàng nên đường ngang chúng là không chiến nhau, đó chọn hậu thư i cần kiểm tra xem trên đường chéo và đường dọc chúng có chiếu vào hậu đã xếp không? Để kiểm tra điều này đường ta dùng biến trạng thái * Đường dọc kiểm soát biến b[j],(j=1,2, ,n) * Một đường chéo kiểm soát biến c[i+j],i+j={2, ,2n} (2) * Còn đường chéo kiểm soát biến d[i-j],i-j={1-n, ,n-1} Các biến trạng thái này khởi gán giá trị True thủ tục Init Như hậu thứ i chấp nhận xếp vào cột j nó thoả mãn ba biến b[j],c[i+j],d[i-j] có giá trị true Các biến này gán giá trị False xếp xong hậu thứ i, và trả lại giá trị true sau gọi Result hay Try(i+1) Ta có chương trình Pascal sau : Program XepHau; Uses crt; var n : integer; a:array[1 30] of integer; b:array[1 30] of boolean; c:array[2 60]of boolean; count,d:word; Procedure Init; Var i:integer; Begin Write('Cho rong ban co n= '); Readln(n); Count:=0; d:=0; For i:=1 to n b[i]:=true; For i:=2 to 2*n c[i]:=true; For i:=1-n to n-1 d[i]:=true; End; Procedure Result; Var i:integer; Begin d:=d+1; count:=count+1; Write('Cach xep thu',count:5,'.'); for i:=1 to n write(a[i]:2); Writeln; if d = 24 then begin readln; d : = 0; end; end; Procedure try(i:integer); Var j : integer; Begin For j:=1 to n If (b[j]) and (c[i + j]) and (d[i - j]) then Begin a [i] : = j; b [j] : = false; c[i + j]: = false; d [i] : = false; if i = n then Result (3) else try (i+1); b [j] : = true; c[i + j]: = true; d[i + j]: = true; end; end; begin clrscr; Init; Try(1); Write ('An Enter de ket thuc:'); Readln; End Để hiểu sâu sắc thuật toán này, mời bạn đọc làm số bài toán sau: Bài 1: Hãy viết chương trình liệt kê tất các dãy nhị phân có độ dài n Bài 2: Hãy viết chương trình liệt kê các hoán vị {1,2, ,n} Bài 3: Hãy viết chương trình liệt kê các tổ hợp chập m {1,2, ,n} Bài 4: Hãy viết chương trình liệt kê tất các chu trình Haminton đồ thị (Chu trình đỉnh v nào đó qua tất các đỉnh còn lại, đỉnh đúng lần quay trở đỉnh v gọi là chu trình Hamilton) Lã Văn Chinh (4)

Ngày đăng: 08/06/2021, 08:02

TỪ KHÓA LIÊN QUAN

w