1. Trang chủ
  2. » Công Nghệ Thông Tin

Thuật toán quay lui và ứng dụng

4 1,6K 43
Tài liệu đã được kiểm tra trùng lặp

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

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Tiêu đề Thuật Toán Quay Lui Và Ứng Dụng
Tác giả Lã Văn Chinh
Trường học Trường Đại Học
Chuyên ngành Công Nghệ Thông Tin
Thể loại bài luận
Định dạng
Số trang 4
Dung lượng 36 KB

Nội dung

Thuật toán quay lui DOMINO

Trang 1

Thuật toán quay lui và ứng dụng

Lã Văn Chinh

Giả thiết một cấu hình cần tìmđược mô tả bởi một bộ phận gồm n thành phần a1, a2,

an Giả sử tìm được i -1 thành phần a1, a2, ai-1, ta tìm thành phần thứ i bằng cách duyệt tất cả cáckhả năng có thể của ai Với mỗi khả năngj kiểm tra xem nó có chấp nhận được không Xảy ra hai trường hợp

Nếu j chấo nhận được thì xác định ai theo j và kiểm tra xem i = n chưa, nếu i = n thì ta ghi nhận một cấu hình, còn nếu i < nta gọi tiến hành xác định ai+1

Nếu thử tất cả các khả năng mà không có khả năng nào chấp nhận được thì quay lại bước trước xác định lại ai-1

Nội dung của thuật toán này rấtphù 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 do

if chấp nhận j then

begin

xác nhận aj theo j

if i=n then < ghi nhận cấu hình >

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 cách sắp xếp những con hậu trên bàn cờ NxN sao

cho chúng không ăn được nhau

Trang 2

Giải: Ta xếp n con hậu trên n dòng, heo nguyên lý nhân ta có nn cách sắp 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 của bàn cờ từ 1 đến n, mỗi cách sắp xếp ứng với 1 bộ gồm a1,a2, ,an

vớiai = j (j=1,2, ,n) có nghĩa là con hậu thứ i đặt vào cột j Giả sử ta chọn được i-1 con hậu bằng cách duyệt tất cả các khả năng của nó

Quan trọng nhất là ta tìm điều kiện chấp nhận j, một con hậu đứng ở một ô trong bàn cờ

nó có nhiều nhất 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 đi của tất cả i-1 con hậu

đã xếp.Bởi vì n con hậu xếp ở hàng nên đường đi ngang của chúng là không chiến nhau,

do đó khi chọn con hậu thư ichỉ cần kiểm tra xem trên 2 đường chéo và đường dọc của chúng có chiếu vào những con hậu đã xếp không Để kiểm tra điều này mỗi đường ta dùng một biến trạng thái

* Đường dọc kiểm soát bằng biến b[j],(j=1,2, ,n)

* Một đường chéo kiểm soát bằng biến c[i+j],i+j={2, ,2n}

* Còn đường chéo kia kiểm soát bằng 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 trong thủ tục Init Như vậy con hậu thứ i

được chấpnhận xếp vào cột j nếu nó thoả mãn cả ba biến b[j],c[i+j],d[i-j] đều có giá trị true.Các biến này gán giá trị False khi xếp xong con hậu thứ i, và trả lại giá trị true sau khi gọi Resulthay 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

Trang 3

Write('Cho do rong ban co n= '); Readln(n);

Count:=0; d:=0;

For i:=1 to n do b[i]:=true; For i:=2 to 2*n do c[i]:=true; For i:=1-n to n-1 do d[i]:=true; End;

Procedure Result;

Var i:integer;

Begin

d:=d+1; count:=count+1;

Write('Cach xep thú,count:5,'.'); for i:=1 to n do 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 do

Trang 4

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 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 một số bài toán sau:

Bài 1: Hãy viết chương trình liệt kê tất cả 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ị của {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 của {1,2, ,n}

Bài 4: Hãy viết chương trình liệt kê tất cả các chu trình Haminton của đồthị

(Chu trình bắt đầu từ đỉnh v nào đó qua tất cả các đỉnh còn lại, mỗiđỉnh đúng một lần rồi quay trở về đỉnh v được gọi là chu trình Hamilton)

Ngày đăng: 11/09/2012, 15:25

TỪ KHÓA LIÊN QUAN

w