Trò chơi Tháp Hà Nội đen trắng: Phiên bản 2

Một phần của tài liệu Luận Văn Thạc sĩ Bài Toán Tháp hà Nội với các Đĩa Màu (Trang 27 - 33)

Bài toán: BWTH Phiên bản 2 có thêm với hạn chế: Cọc 1 chỉ chứa các đĩa

trắng (từ tháp 0), trong khi đó cọc 3 chỉ chứa các đĩa đen (từ tháp 1). Như vậy, các đĩa trắng chỉ có thể sử dụng các cọc 0, 1, 2 trong khi chuyển từ cọc 0 tới cọc 2, còn các đĩa đen chỉ có thể sử dụng các cọc 2, 3 và 0 khi chuyển từ cọc 2 sang cọc 0.

Victor Mascolo đã nhận bằng phát minh U.S. No 7.566.057 cho trò chơi này (còn được gọi là trò chơi rùa-Turtle game). Ta có

Định lí 4 [12] Số bước chuyển tối ưu trong bài toán BWTH Phiên bản 2là

( )

3 2n −1 .

Các bước thực hiện:

Một thuật toán tối ưu cho Phiên bản 2 tương tự như phân tích ở trên cho Phiên bản 1. Nhưng Phiên bản 2 đòi hỏi rằng hai chuyển động đầu tiên và hai chuyển động cuối cùng đều phải là một trong hai đĩa nhỏ nhất. Và như trên, phải có ít nhất một di chuyển của một đĩa nhỏ nhất giữa bất kỳ giữa hai di chuyển của các đĩa lớn hơn. Vì vậy, số lần chuyển các đĩa nhỏ nhất phải lớn hơn tổng số lần chuyển của các đĩa lớn hơn ba di chuyển.

Nếu kí hiệu M n2( ) là số lần chuyển đĩa tối thiểu (tối ưu) của một thuật toán cho Phiên bản 2, thì các đĩa lớn phải có ít nhất M n2( −1) lần chuyển, trong khi các đĩa nhỏ nhất phải thực hiện ít nhất M n2( − +1) 3 lần chuyển. Vậy tổng số lần chuyển đĩa ít nhất phải là 2M n2( − +1) 3 cho n≥2.

2( ) 3.2n 3 3(2n 1).

M n ≥ − = −

Nếu đánh giá dưới này có thể đạt được (M n2( ) 3(2= n −1)), thì có thể sử dụng nó để giúp tạo ra một thuật toán tối ưu. Bắt đầu với bài toán cho n=1 đĩa ta mất 3 lần di chuyển. Thật vậy.

Trạng thái ban đầu: cọc 0 chứa 1 đĩa trắng, cọc 2 chứa 1 đĩa đen. Trạng thái cuối: cọc 0 chứa đĩa đen, cọc 2 chứa đĩa trắng.

Bước 1: Chuyển đĩa trắng từ cọc 0 sang cọc 1 Bước 2: Chuyển đĩa đen từ cọc 2 sang cọc 0 Bước 3: Chuyển đĩa trắng từ cọc 1 sang cọc 2

Vậy ta mất 3 lần chuyển với trường hợp n=1 đĩa (Hình 2.6)

Hình 2.6: Các bước chuyển với n=1 đĩa.

Xét các di chuyển của đĩa lớn hơn của một đống n=2 đĩa và xem nếu có thể tìm thấy 6 di chuyển của những đĩa nhỏ nhất để kết hợp với trường hợp n=1 đĩa, khi đó ta có tất cả là 9 lần di chuyển (Hình 2.7), trong một qui trình SSLSLSLSS. Ở đây S (Smallest) là một trong hai đĩa nhỏ nhất và L (Larger) là một trong hai đĩa lớn hơn. Qui trình này được thực hiện như sau.

Trạng thái ban đầu: cọc 0 chứa 2 đĩa trắng kí hiệu T1 và T2 (T1 bé hơn T2), cọc 2 chứa 2 đĩa đen kí hiệu Đ1 và Đ2 (Đ1 bé hơn Đ2) và ta có kích thước T1=Đ1 và T2=Đ2.

Trạng thái cuối: cọc 0 chứa 2 đĩa đen, cọc 2 chứa 2 đĩa trắng.

Bước 1: Chuyển đĩa trắng T1 từ cọc 0 sang cọc 1 (tương ứng với chữ S đầu

tiên bên trái trong qui trình SSLSLSLSS).

Bước 2: Chuyển đĩa đen Đ1 từ cọc 2 sang cọc 0.

Bước 4: Chuyển đĩa đen Đ1 từ cọc 0 sang cọc 3.

Bước 5: Chuyển đĩa trắng T2 từ cọc 0 sang cọc 2.

Bước 6: Chuyển đĩa đen Đ1 từ cọc 3 sang cọc 2.

Bước 8: Chuyển đĩa đen Đ1 từ cọc 2 sang cọc 0.

Bước 9: Chuyển đĩa trắng T1 từ cọc 1 sang cọc 2.

Hình 2.7: Các bước di chuyển với n=2 đĩa

Tiếp tục, có thể thử với đống n=3 đĩa bằng cách tương tự. Ta có 9 lần chuyển của bốn đĩa lớn và có 12 lần di chuyển của hai đĩa nhỏ nhất. Tổng cộng là 21 di chuyển cho hai đống có n=3 đĩa.

Thuật toán của Phiên bản 2

Giả sử rằng n là số dương. Ta có thuật toán sau đây giải bài toán Phiên bản 2.

procedure Turtle (n)

stack = 0;

Move(1, 0, 0, 1); for i from 1 to n-1 do stack = 1-stack;

Move(i, stack, 2*stack, 2*stack+2);

Move(i+1, stack, 2*stack, 2*stack+1);

Hanoi(i, 1, stack, 2*stack+2, 2*stack, 2*stack+1); stack = 1-stack;

Move(n, stack, 2*stack, 2*stack+2); for i from n-1 down to 1 do

stack = 1-stack;

Hanoi(i, 1, stack, 2*stack+1, 2*stack+2, 2*stack); Move(i+1, stack, 2*stack+1, 2*stack+2);

Hanoi(i-1, 1, stack, 2*stack, 2*stack+2, 2*stack+1); Move(i, stack, 2*stack, 2*stack+2);

stack = 1-stack; Move(1, 0, 1, 2);

Tính chất quan trọng dưới đây của thuật toán này có thể được chứng minh bằng qui nạp: tại cuối mỗi chu trình của vòng đầu (the top loop), đĩa từ 1 xuống i+1 của đống đĩa hiện tại (thí dụ, màu đen) đang ở trên nó cọc tạm thời trong khi các đĩa từ i+2 đến n vẫn còn trên cọc ban đầu.

Với đống đối diện (màu trắng), các đĩa từ 1 xuống đến i ở cọc tạm thời của chúng và đĩa i+1 đến n vẫn còn trên cọc ban đầu của nó.

Một tính chất tương tự cũng đúng cho cuối mỗi vòng lặp của vòng cuối (the bottom loop): đĩa từ 1 đến i−1 của đống hiện tại đang trên cọc tạm thời của nó, trong khi đó các đĩa i đến đĩa n được đặt trên cọc đích của nó.

Với đống đối diện, các đĩa từ 1 xuống đến i ở cọc tạm thời của nó, trong khi đó các đĩa i+1 đến n đã được đặt trên cọc đích của nó.

Từ tính chất này suy ra rằng tất cả các bước chuyển là hợp lệ và mã (code) này cho lời giải của trò chơi.

Lần lặp i của vòng đầu (the top loop) tạo ra 1 (2+ i−1− + +1) 1 (2 1) 3.2i − = i−1

( ) 1 1 2 1 1 3(2 1). 3.2 3 1 2 ... 2 n i n i n − − − = = + + + = − − ∑

Vòng lặp cuối (the bottom loop) cũng tạo ra số lần chuyển bằng số lần chuyển trong vòng lặp đầu.

Vì ta còn có thêm 3 lần chuyển bên ngoài các vòng đó nên tổng số tất cả các lần chuyển là

1 1

3(2n− − +1) 3(2n− − + =1) 3 3(2n −1).

Thuật toán chuyển là duy nhất, ngoại trừ việc quyết định đĩa 1 của đống đĩa nào di chuyển đầu tiên.

Một phần của tài liệu Luận Văn Thạc sĩ Bài Toán Tháp hà Nội với các Đĩa Màu (Trang 27 - 33)

Tải bản đầy đủ (DOC)

(44 trang)
w