Thuật toán quay lui DOMINO
Trang 1Thuậ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
Trang 227 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);
Trang 3For 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;
Trang 4End;
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:
Trang 5- 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à 39 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)
Trang 6Dữ liệu vào có trong file văn bản DUHANH.INP có cấu trúc:
- Dòng đầu tiên chứa hai số M và N,
- Trong M dòng tiếp theo chứa bản đồ của hành tinh: mỗi dòng chứa một xâu văn bản (đặt ngay từ đầu dòng) gồm các kí tự ’0’, ’1’, ’2’ với ý nghĩa sau:
’0’: ô rỗng ’1’: ô có một robot ’2’: ô có nhà du hành
Kết quả được in ra màn hình và ghi vào văn bản DUHANH.OUT có nội dung như sau:
- Dòng đầu ghi số đơn vị thời gian nhà du hành tồn tại trên hành tinh (quy ước ghi −1 nếu anh ta tồn tại mãi mãi)
- ứng với mỗi thời điểm có M dòng trên file output bản đồ hành tinh trong lịch trình, mỗi thời điểm cách nhau một dòng trống
Ví dụ: Phần đầu của một lịch trình được thể hiên như sau:
Ví dụ:
Trang 7Hướng dẫn giải
Sau mỗi bước hoặc robot gần người thêm một dơn vị khoảng cách hoặc không gian bị hạn
chế thêm một đơn vị độ dài cả về chiều rộng lẫn chiều dài, do đó ta đi đến khẳng định: nếu
người tồn tại sau K = Min{M,N} bước thì người tồn tại mãi mãi hay nếu người bị robot ăn thịt thì không thể tồn tại sau K bước di chuyển.
Với khẳng định trên đây lặp không quá K bước trong đó mỗi bước lặp liên quan đến việc thực hiện 5 cách đi trong bước Như vậy tổng số bước không vượt quá 5 K thuật toán
Để lưu trữ về tình trạng bản đồ của hành tinh ta dùng mảng A[1 K,1 M,1 N] Sau mỗi bước thử cách đi cho nhà du hành ta sẽ sử dụng một thủ tục để cho các con robot di chuyển tiến lại gần nhà du hành