Tải bản đầy đủ (.doc) (7 trang)

Thuật toán quay lui DOMINO

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (184.39 KB, 7 trang )

Thuật toán quay lui
Trần Đình Trung
Bài 4: Bộ bài Domino với bản đồ số
Bộ bài domino gồm 28 quân đánh số từ 1 đến 28. Mỗi quân bài là một thanh hình chữ nhật
được chia làm hai hình vuông bằng nhau. Trong đó người ta ghi các số từ 0 (để trống) đến
6 bằng cách trổ các dấu tròn trắng. Dưới đây liệt kê 28 quân bài domino:
Sắp xếp 28 quân bài domino ta có thể tạo ra một hìmh chữ nhật kích thước 7*8 ô vuông.
Mỗi cách sắp xếp như vậy sẽ tạo ra một bản đồ số. Ngược lại, mỗi bản đồ số có thể tương
ứng với một số cách xếp.
Ví dụ bản đồ số:
4 2 5 2 6 3 5 4
5 0 4 3 1 4 1 1
1 2 3 0 2 2 2 2
1 4 0 1 3 5 6 5
4 0 6 0 3 6 6 5
4 0 1 6 4 0 3 0
6 5 3 6 2 1 5 3
tương ứng với hai cách xếp mô tả bởi hai bảng số sau:
16 16 24 18 18 20 12 11
06 06 24 10 10 20 12 11
08 15 15 03 03 17 14 14
08 05 05 02 19 17 28 26
23 01 13 02 19 07 28 26
23 01 13 25 25 07 21 04
27 27 22 22 09 09 21 04
16 16 24 18 18 20 12 11
06 06 24 10 10 20 12 11
08 15 15 03 03 17 14 14
08 05 05 02 19 17 28 26
23 01 13 02 19 07 28 26
23 01 13 25 25 07 21 04


27 27 22 22 09 09 21 04
Bài toán đặt ra là cho trước một bảnng số, hãy liệt kê tất cả các cách xếp có thể tạo ra từ
nó.
Dữ liệu vào từ file DOMINO.INP là ma trận 7*8 mô tả bản đồ số ban đầu.
Kết quả ghi ra file DOMINO.OUT dòng đầu là số lượng p cách xếp tìm được. Tiếp theo là
p nhóm dòng, mỗi nhóm gồm 7 dòng ghi các dòng của các bảng tương ứng với một bảng
số tìm được.
Hướng dẫn giải
Vói mỗi quân bài domino ta có thể có hai khả năng xếp vào hình chữ nhật: hoặc là đặt nằm
ngang, hoặc là đặt nằm dọc. Ta sẽ thử tất cả các cách để đặt chúng vào hình chữ nhật cho
đến khi nào đặt được cả 28 quân bài vào hình chữ nhật thì đó là một trong các cách xếp
thoả mãn. Mỗi cách xếp thoả mãn sẽ được lưu vào mảng L[1..10,1..7,1..8].
Văn bản chương trình
Program Bo_bai_domino_voi_cac_ban_do_so;
Type Bandoso = array[1..7,1..8] of byte;
Sothutu = array[0..6,0..6] of byte;
Cauhinh = array[1..10,1..7,1..8] of byte;
Const Fi = ’DOMINO.INP’;
Fo = ’DOMINO.OUT’;
D : array[1..2] of byte = (0,1);
C : array[1..2] of byte = (1,0);
Var A,B : Bandoso;
L : Cauhinh;
Gt : Sothutu;
TS : set of byte;
T,dem: byte;
F : Text;
Procedure Read_inp;
Var i,j,k : byte;
Begin

Assign(F,Fi); Reset(F); dem:= 0;
For i:= 1 to 7 do
begin
For j:= 1 to 8 do read(F,A[i,j]);
Readln(F);
end;
For i:= 0 to 6 do
For j:= i to 6 do
begin
Inc(k); Gt[i,j]:= k; Gt[j,i]:= k;
end;
Close(F);
End;
Function Sott(x: byte) : String;
Var S : String;
Begin
Str(X,S);
If length(S) = 1 then S:= ’0’ + S;
Sott:= S;
End;
Procedure Result;
Var i,j : byte;
Begin
Inc(dem);
For i:= 1 to 7 do
For j:= 1 to 8 do L[dem][i,j]:= B[i,j];
End;
Procedure Try(i,j : byte);
Var k,u,v,x : byte;
Begin

While (j < 8) and (B[i,j] > 0) do inc(j);
If (j = 8) and (B[i,j] > 0) then Try(i+1,1) else
For k:= 1 to 2 do
begin
u:= i + D[k]; v:= j + C[k];
If (u in [1..7]) and (v in [1..8]) and (B[u,v] = 0) then
begin
x:= Gt[A[i,j],A[u,v]];
If not (x in Ts) then
begin
Inc(t); Ts:= Ts + [x];
B[i,j]:= x; B[u,v]:= x;
If t = 28 then Result else
If v = 8 then Try(i+1,1) else Try(i,v+1);
Dec(t); Ts:= Ts - [x];
B[i,j]:= 0; B[u,v]:= 0;
end
end;
end;
End;
Procedure Write_out;
Var k,i,j : byte;
Begin
Assign(F,Fo); Rewrite(F);
Writeln(dem);
For k:= 1 to dem do
begin
For i:= 1 to 7 do
begin
For j:= 1 to 8 do write(F,Sott(L[dem][i,j]),’ ’);

Writeln(F);
end;
Writeln(F); Writeln(F);
end;
Close(F);
End;
BEGIN
Read_inp;
Try(1,1);
Write_out;
END.
Bài 5: Robot quét vôi
Có 9 căn phòng (đánh số từ 1 đến 9) đã được quét vôi với mầu trắng, xanh hoặc vàng. Có 9
rôbôt (đánh số từ 1 đến 9) phụ trách việc quét vôi các phòng. Mỗi rôbôt chỉ quét vôi một số
phòng nhất định. Việc quét vôi được thực hiện nhờ một chương trình cài sẵn theo qui tắc:
- Nếu phòng đang có mầu trắng thì quét mầu xanh,
- Nếu phòng đang có mầu xanh thì quét mầu vàng,
- Nếu phòng đang có mầu vàng thì quét mầu trắng.
Cần phải gọi lần lượt một số các rôbôt ra quét vôi (mỗi lần một rôbôt, một rôbôt có thể gọi
nhiều lần và có thể có rôbôt không được gọi. Rôbôt được gọi sẽ quét vôi tất cả các phòng
mà nó phụ trách) để cuối cùng các phòng đều có mầu trắng. Hãy tìm một phương án như
vậy sao cho lượng vôi phải quét là ít nhất. Giả thiết rằng luợng vôi cho mỗi lượt quét đối
với các phòng là như nhau.
Dữ liệu: đọc từ file văn bản ROBOT.INP gồm các dòng:
- 9 dòng đầu, mỗi dòng mô tả danh sách các phòng được quét vôi bởi một rôbôt theo thứ tự
từ rôbôt 1 đến rôbôt 9. Mỗi dòng như vậy gồm các số hiệu phòng viết sát nhau. Chẳng hạn
dòng thứ 3 có nội dung: 2356 mô tả rôbôt 3 phụ trách việc quét vôi các phòng 2, 3, 5, 6.
- Dòng cuối mô tả mầu vôi ban đầu của các phòng. Dòng gồm 9 ký tự viết sát nhau, ký tự
thứ i biểu diễn mầu vôi của phòng i với quy ước: ký tự T chỉ mầu trắng, ký tự X chỉ mầu
xanh, ký tự V chỉ mầu vàng.

Kết quả: đưa ra file văn bản ROBOT.OUT gồm một dòng dưới dạng:
- Nếu không có phương án thì ghi một chữ số 0,
- Trái lại ghi dãy thứ tự các rôbôt được gọi (các số hiệu rôbôt viết sát nhau).
Ví dụ
Hướngdẫn giải
Ta sẽ giải bài toán bằng cách duyệt theo cây tìm kếm. Với mỗi con robot ta có thể không
gọi hoặc sẽ gọi tối đa là hai lần, do đó là sẽ có ba cách lựa chọn. Ta sẽ lần lượt duyệt các
danh sách để gọi các con robot. Vì có tất cả 9 danh sách nên ta phải duyệt tối đa là 3
9
cách
gọi. Do bài toán đòi hỏi là lượng vôi ít nhất nên ta sẽ tìm cách gọi nào là tối ưu nhất. Để
giảm bớt số lần duyệt ta có thể dùng thêm cận để kiểm tra điều kiện có thực hiện tiếp hay
không. Nếu ở bước thứ i ta cần gọi là S robot là số lần gọi tối ưu lúc đó là Min thì nếu S >
min thì ta có thể nhánh này của cây và quay lại bước thứ i − 1, nếu S < min thì ta có thể
tiếp tục đuyệt.
Bài 6: Nhà du hành vũ trụ
Một nhà du hành vũ trụ bị lạc vào một hành tinh được thống trị bởi các con robot. Giả sử
hành tinh được chia thành một mảng hình chữ nhật các ô vuông kích thước M X N ( M,N ≤
8). Tất cả mọi con robot đều tìm cách tiến lại nhà du hành để tiêu diệt, còn nhà du hành thì
tìm cách tránh xa các con robot. Cứ sau một dơn vị thời gian nhà du hành có thể đi theo 4
hướng Đông, Tây, Nam, Bắc hoặc đứng yên. Tất cả các con robot được lập trình đi theo 1
trong 8 hướng kể cả đường chéo sao cho khoảng cách từ con robot đến nhà du hành là nhỏ
nhất (khoảng cách này không lớn hơn khoảng cách ở thời điểm trước) trong đó đường chéo
được tính theo công thức hình học thông thường. Các con robot luôn chuyển động theo
nhịp thời gian.
Nếu hai con robot cùng đến một ô thì cả hai con robot này bị nổ tung và để lại trên ô đó
một nhiệt độ huỷ diệt được duy trì mãi và nhiệt độ này đủ để phá huỷ các con robot hoặc
nhà du hành chẳng may đặt chân lên ô đó. Ô này trở thành nguy hiểm.
Tất cả các con robot không được lập trình để tránh các ô nguy hiểm hoặc tránh đụng độ
nhau mà chỉ được lập trình để gần nhà du hành một cách máy móc.

Khi một hoặc nhiều robot cùng du hành ở cùng một ô vuông thì nhà du hành bị tiêu diệt.
Nhà du hành không thể đi tới một ô đang có robot.
Bài toán đặt ra:cho bản đồ của hành tinh (có vị trí của nhà du hành và các con robot), hãy
tìm cách di chuyển nhà du hành theo một lịch trình sao cho nhà du hành có thể tồn tại lâu
nhất trên hành tinh (thông báo trường hợp nhà du hành tồn tại mãi mãi trên hành tinh).

Tài liệu bạn tìm kiếm đã sẵn sàng tải về

Tải bản đầy đủ ngay
×