Trò chơi (Bài toán) Tháp Hà Nội được nhà toán học người Pháp Edouard Lucas phát minh và phổ biến rộng rãi ở Paris năm 1883, là một bài toán nổi tiếng thế giới, hiện nay đang được nghiên cứu bởi rất nhiều nhà toán học và khoa học máy tính, các chuyên gia giáo dục và y học, được đưa vào nhiều giáo trình tin học và sách về trò chơi toán học như một ví dụ điển hình về thuật toán đệ qui và lập trình căn bản, nhưng hình như chưa được chú ý nghiên cứu và phổ biến rộng rãi ở Việt Nam.
MỤC LỤC Trang Mục lục Mở đầu Chương Bài toán Tháp Hà Nội với nhiều cọc 1.1 Bài toán tháp Hà Nội cổ điển 1.2 Bài toán tháp Hà Nội với nhiều cọc Chương Trò chơi Tháp Hà Nội với đĩa màu 2.1 Các biến thể trò chơi tháp Hà Nội 2.2 Một số thí dụ trị chơi tháp Hà Nội với đĩa màu 2.2.1 Bài toán 2.2.2 Bài toán 2.2.3 Bài toán 2.3 Trò chơi tháp Hà Nội đen trắng 2.3.1 Trò chơi Tháp Hà Nội đen trắng: Phiên 2.3.2 Trò chơi Tháp Hà Nội đen trắng: Phiên 2.3.3 Trò chơi Tháp Hà Nội đen trắng: Phiên 2.3.4 Trò chơi Tháp Hà Nội đen trắng: Phiên Kết luận Tài liệu tham khảo 1 4 11 11 12 12 13 13 22 23 27 33 38 42 43 MỞ ĐẦU Trò chơi (Bài toán) Tháp Hà Nội nhà toán học người Pháp Edouard Lucas phát minh phổ biến rộng rãi Paris năm 1883, toán tiếng giới, nghiên cứu nhiều nhà tốn học khoa học máy tính, chuyên gia giáo dục y học, đưa vào nhiều giáo trình tin học sách trị chơi tốn học ví dụ điển hình thuật tốn đệ qui lập trình bản, chưa ý nghiên cứu phổ biến rộng rãi Việt Nam Mặc dù trò chơi Tháp Hà Nội có mặt nhiều trang WEB giáo trình tiếng Việt, số lượng viết tiếng Việt giới thiệu trị chơi tốn Tháp Hà Nội tạp chí cịn sơ lược, chưa có nghiên cứu tiếng Việt toán Tháp Hà Nội, tính riêng số báo giới nghiên cứu toán Tháp Hà Nội lĩnh vực Tốn-Tin học có đến gần 500 với khoảng 250 với đầu đề có cụm từ The Tower of Hanoi, đăng 100 tạp chí khoa học uy tín Đó chưa kể đến viết sử dụng toán Tháp Hà Nội khoa học giáo dục y học Bài toán Tháp Hà Nội thú vị đến mức dùng làm đề tài số luận án Tiến sĩ luận văn cao học nước (Trung Quốc, Mỹ, Đức,…) Hai hội thảo khoa học quốc tế tổ chức Slovenia (2005) Paris 2009 Đã có hai sách chuyên khảo ([4] [8]) Bài toán Tháp Hà Nội Bài toán Tháp Hà Nội khơng thú vị chỗ mang tên Hà Nội, thủ đô Việt nam, mà hấp dẫn nhà Tốn-Tin học liên quan đến nhiều vấn đề giải thuật đệ qui, hệ đếm, tam giác Pascal, thảm Sierpinski, lý thuyết đồ thị chu trình Hamilton, ơtơmát hữu hạn, độ phức tạp tính tốn, Bài tốn Tháp Hà Nội gợi ý cho nhiều nghiên cứu khoa học máy tính tốn học Sau kỉ, trị chơi Tháp Hà Nội tổng qt hóa (trị chơi Tháp Hà Nội với nhiều cọc, trò chơi Tháp Hà Nội song song,…) có nhiều cải biên (trị chơi Tháp Hà Nội xoay vòng, trò chơi Tháp Hà Nội với đĩa màu, ) Những tổng quát hóa cải biên dẫn đến vấn đề toán học thú vị, chí dẫn tới nhiều tốn chưa có lời giải Luận văn Bài tốn Tháp Hà Nội với đĩa màu có mục đích trình bày tốn Tháp Hà Nội cải biên, cọc đĩa gán cho màu định Luận văn gồm phần mở đầu, hai Chương phần tài liệu tham khảo Chương Bài toán Tháp Hà Nội với nhiều cọc Chương Trò chơi Tháp Hà Nội với đĩa màu Luận văn hoàn thành hướng dẫn tận tình PGS.TS Tạ Duy Phượng Em xin bầy tỏ lòng biết ơn sâu sắc Thầy Em xin cảm ơn Thầy Cô trường Đại học Khoa Học - Đại học Thái Ngun Viện Tốn học tận tình giảng dạy em suốt trình học cao học Em xin cảm ơn khoa Toán - Tin trường Đại học Khoa học - Đại học Thái Nguyên, quan tâm giúp đỡ, tạo điều kiện thuận lợi cho em thực kế hoạch học tập Tơi xin chân thành cảm ơn Sở Giáo dục Đào tạo tỉnh Tun Quang, trường Trung học Phổ thơng Hịa Phú, Chiêm Hóa, Tuyên Quang, tạo điều kiện giúp đỡ thời gian học Cao học Xin cảm ơn người thân, đồng nghiệp, bạn bè cổ vũ động viên tơi suốt q trình làm luận văn Thái Nguyên, 20.11.2015 Vũ Hoàng Đạo Chương BÀI TOÁN THÁP HÀ NỘI VỚI NHIỀU CỌC Nhằm làm sáng tỏ toán xét Chương 2, Chương trình bày sơ lược tốn tháp Hà Nội cổ điển tốn mở rộng toán tháp Hà Nội với nhiều cọc 1.1 Bài toán tháp Hà Nội cổ điển Năm 1883 nhà toán học người Pháp Édouard Lucas (1842–1891) phát minh truyền bá trị chơi tháp Hà Nội Trị chơi (Bài tốn) tháp Hà Nội cổ điển (the Hanoi Tower - TH) phát biểu sau: Có ba cọc thẳng đứng gắn đế nằm ngang Cho n đĩa trịn có lỗ đường kính khác Lúc đầu đĩa lồng vào cọc theo thứ tự từ lớn đến nhỏ, từ thấp lên cao, tạo nên tòa tháp Trò chơi đòi hỏi di chuyển đĩa, cách đặt chúng vào cọc bên cạnh, lần chuyển đĩa, theo qui tắc sau I Mỗi lần chuyển đĩa từ ba cọc II Sau lần chuyển, đĩa nằm ba cọc, theo thứ tự từ lớn đến nhỏ, từ thấp đến cao III Đĩa ba cọc đặt vào cọc trống đặt lên hai cọc khác, đĩa nhỏ đĩa cọc Qui tắc sau gọi Qui tắc thiêng liêng (devine rule): Không đặt đĩa lên đĩa có đường kính nhỏ Một phân bố n đĩa ba cọc gọi trạng thái (state) hay cấu hình (configuration) Một trạng thái (một cấu hình) gọi qui (regular) hay hợp lệ khơng có đĩa nằm đĩa nhỏ Một trạng thái gọi hồn hảo (perfect) qui tất đĩa nằm cọc Hình ví dụ trạng thái (với số đĩa n = ) Thuật toán giải toán tháp Hà Nội cổ điển Bước 1: Chuyển đĩa số từ cọc A sang cọc C; Bước 2: Chuyển đĩa số sang cọc B; Bước 3: Chuyển đĩa số từ cọc C sang cọc B Khi đĩa số nằm đĩa số Như vậy, ta có hai đĩa nằm cọc B, cọc C thời trống Bước 4: Chuyển đĩa số từ cọc A sang cọc C Lặp lại ba bước để giải toán cho hai đĩa: chuyển đĩa số đĩa số cho nằm lên đĩa số cọc C Tiếp tục làm cho bốn, năm,… đĩa Mỗi lần dựng xong tháp từ đĩa thứ k đến đĩa thứ (trên cọc B cọc C, hai cọc trống), ta chuyển đĩa thứ k + từ cọc A sang cọc trống (cọc C cọc B), lại di chuyển tháp dựng từ cọc B (hoặc cọc C) lên đĩa thứ k + để tháp với k + đĩa Như vậy, xây dựng xong tháp với k đĩa ta dễ dàng xây dựng tháp với k + đĩa sau chuyển đĩa thứ k + sang cọc trống Phương pháp gọi thuật giải đệ qui: Để tiến hành giải toán với n + đĩa, ta áp dụng lại thuật giải tốn với n đĩa Tồn q trình cần số hữu hạn bước, đến lúc thuật giải áp dụng cho n = Bước đơn giản chuyển đĩa từ cọc A sang cọc C Kí hiệu L ( n ) số lần chuyển đĩa tối ưu toán tháp Hà Nội với n đĩa ba cọc Khi ấy, để chuyển n đĩa từ cọc A sang cọc C, trước tiên ta phải chuyển n − đĩa (các đĩa nhỏ) từ cọc A sang cọc B, sau chuyển đĩa thứ n từ cọc A sang cọc C Cuối cùng, lại chuyển n − đĩa từ cọc B sang cọc C Định lí (Theorem 2.1, [2], p 73-74) Số bước chuyển tối ưu toán tháp Hà Nội với ba cọc n đĩa L(n) = 2n − Chứng minh Ta có: L ( 1) = 1, L ( ) = 3, L ( n ) = L ( n − 1) + L ( 1) + L ( n − 1) = L ( n − 1) + Theo qui nạp, ta có L(n + 1) = L(n) + = 2.(2 n − 1) + = n+1 − n Vậy công thức L(n) = − chứng minh với n 1.2 Bài toán tháp Hà Nội với nhiều cọc Một mở rộng tự nhiên toán Tháp Hà Nội với ba cọc Bài toán Tháp Hà Nội với bốn (hoặc nhiều) cọc Chính tác giả tốn Tháp Hà Nội, E Lucas người xét toán với nhiều cọc vào năm 1899, xem [5] Năm 1902-1903 Henry Bài toán Tháp Hà Nội với bốn cọc Ernest Dudeney viết hai báo toán Tháp Hà Nội với bốn cọc Trong hai trang sách tiếng The Canterbury Puzzles and Other Curious Problems xuất London năm 1907 New York năm 1908 (xem [1]), Ông viết tốn trị chơi tháp Hà Nội với bốn cọc (dưới dạng quân cờ) số đĩa 8, 10 21 gọi The Reve's puzzle-câu đố Reve) Trong phần lời giải (trang 131-132), Dudeney khẳng định (không chứng minh) số lần chuyển cần thiết tương ứng với 8, 10 21 đĩa 33, 49 321 Hơn nữa, Ông xét trường hợp với số đĩa số tam giác, tức số tk = k ( k + 1) k ( k + 1) , k = 1,2, Giả sử tk = số tam giác thứ k 2 giả sử M (n) số lần chuyển tối thiểu cần thiết để chuyển xong n đĩa Dudeney tuyên bố mà không chứng minh M ( tk ) = 2M ( tk −1 ) + 2k − 1, M ( 1) = Từ ta có M ( 3) = ; M ( ) = 17 , M ( 10 ) = 49 ,… Tuy nhiên Dudeney khơng cho thuật tốn cho phép tìm số này, khơng có gợi ý cho trường hợp số đĩa khơng phải số tam giác, thí dụ n = Bài toán tổng quát với p > cọc, p số với số đĩa n B M Stewart đề xuất năm 1939 (Problem 3918 tạp chí The Americal Mathematical Montly [9]) Lời giải độc lập toán B M Stewart [10] J S Frame [3] trình bày tạp chí năm 1941 Các thuật toán Stewart Frame với số thuật toán cải biên khác chứng minh tương đương theo nghĩa số lần chuyển đĩa (xem [11]) Vì người ta thường gọi chung thuật tốn hai Ơng thuật tốn tương đương thuật toán Frame- Stewart Giả sử n số đĩa nằm cọc p số cọc đánh số từ đến p − Để giải toán tháp Hà Nội với p cọc, ta thực bước sau Bước Với số l , ≤ l ≤ n , chuyển l đĩa từ cọc tới cọc 3, S p (l ) lần chuyển Được phép sử dụng tất cọc chuyển Bước Giữ nguyên cọc chứa l đĩa Chuyển n − l đĩa từ cọc tới cọc đích, sử dụng n − cọc cịn lại (vì cọc dùng để chứa l đĩa nhỏ nhất), S p −1 (n − l ) lần chuyển Bước Cuối cùng, chuyển l đĩa từ cọc tới cọc đích, S p (l ) lần chuyển Được phép sử dụng tất đĩa Như vậy, tổng cộng cần S p (l ) + S p −1 (n − l ) lần chuyển Bài tốn đặt là, cần tính số l để tổng nhỏ Thuật toán Frame-Stewart với cách chọn l cho phép tìm (một vài) giá trị i cho 2S p (i ) + S p −1 (n − i ) = { S p (l ) + S p −1 (n − l )} 1≤l ≤ n Nói cách khác, giá trị i thỏa mãn công thức số bước tối ưu cần thiết lớp thuật toán đề nghị B M Stewart J S Frame chứng minh rằng, n số tam giác n = tk , cách chọn tối ưu cho l l = k , tk −1 < n < tk hai giá trị k − k cách chọn tối ưu cho l Như vậy, B M Stewart J S Frame đề xuất thuật toán giải cho toán Tháp Hà Nội với số cọc Thuật tốn trùng với lời giải H E Dudeney trường hợp riêng nêu Ta lưu ý rằng, khác với trường hợp toán với ba cọc, lời giải cho tốn với bốn cọc khơng Hơn nữa, ta biết, số lần chuyển đĩa cho toán ba cọc S3 (n) = n − , nên S3 (n) tăng theo hàm mũ Tuy nhiên, trường hợp số cọc p ≥ , phân tích thuật tốn Frame- Stewart, Stockmeyer 1994 [11] phát rằng, độ phức tạp thuật toán mũ (sub-exponential), cỡ ( ) cho k = Θ n2 n Như vậy, ý tưởng thuật toán Frame-Stewart cho toán bốn cọc sử dụng chiến lược chia để trị (hay dùng thuật toán tin học) Cụ thể sau: Chia n đĩa thành hai phần, phần gồm l đĩa có kích thước nhỏ, phần chứa n − l đĩa có kích thước lớn Chuyển l đĩa từ cọc thứ sang cọc thứ tư cách giải toán ba cọc với l đĩa nhỏ Tiếp tục giải ba cọc với n − l đĩa lớn Sau lại giải tốn ba cọc với l đĩa để chuyển l đĩa cọc chứa n − l đĩa lớn toán giải xong Tuy nhiên, Otto Dunkel [2], tổng biên tập tạp chí The Americal Mathematical Montly cho đăng hai lời giải Frame Stewart rằng: Chứng minh tính tối ưu Frame Stewart áp dụng cho thuật toán lược đồ chung mô tả Frame Stewart mà thơi Nói cách khác, Frame Stewart chứng minh rằng: số tất giá trị l (theo thuật tốn hai Ơng) phải có giá trị i làm cực tiểu số lần chuyển Hai ông chưa chứng minh thuật toán tối ưu bắt buộc phải có dạng Và điều chưa chứng minh Vì lời giải Frame Stewart cần phải coi cách đắn lời giải giả định tối ưu (presumed optimal solution), chưa chứng minh lời giải tối ưu Từ 1941 đến nay, nhiều người khác nghiên cứu thuật toán Gần số tác giả đề nghị số thuật toán hồi qui tương đương với thuật tốn Frame -Stewart (xem [14]) Nhưng tính tối ưu thuật toán chưa chứng minh Đây ví dụ tiêu biểu cho thấy: từ tốn đơn giản, giải được, cách nới lỏng số ràng buộc (tăng thêm số cọc), lại trở thành khó nhiều, xuất vấn đề (sự tồn tại, tính nhất, tính tối ưu nghiệm) Việc chưa chứng minh tính tối ưu thuật toán Frame –Stewart cho toán với bốn nhiều cọc tối ưu không suy không tồn thuật tốn tìm (tất cả) nghiệm tối ưu Mặc dù chưa chứng minh số lần chuyển đĩa tối ưu xác bao nhiêu, thuật tốn Frame-Stewart cải biên cho lời giải giả định tối ưu (presumed-optimal solution), cho phép lập trình giải tốn tháp Hà Nội với số cọc Tính tối ưu thuật tốn FrameStewart kiểm tra máy tính cho số đĩa nhỏ 30 Định lí ([12]) Số bước chuyển giả định tối ưu thuật toán Frame Stewart cho toán bốn cọc R (n) = (l − 1)2l − ( l số tự nhiên gần l (l − 1) − n)2l −1 + 1, 2n 10 Bước 4: Chuyển đĩa đen Đ1 từ cọc sang cọc Bước 5: Chuyển đĩa trắng T2 từ cọc sang cọc Bước 6: Chuyển đĩa đen Đ1 từ cọc sang cọc Bước 7: Chuyển đĩa đen Đ2 từ cọc sang cọc 30 Bước 8: Chuyển đĩa đen Đ1 từ cọc sang cọc Bước 9: Chuyển đĩa trắng T1 từ cọc sang cọc Hình 2.7: Các bước di chuyển với n = đĩa Tiếp tục, thử với đống n = đĩa cách tương tự Ta có lần chuyển bốn đĩa lớn có 12 lần di chuyển hai đĩa nhỏ Tổng cộng 21 di chuyển cho hai đống có n = đĩa Thuật toán Phiên Giả sử n số dương Ta có thuật tốn sau giải toán Phiên procedure Turtle (n) stack = 0; Move(1, 0, 0, 1); for i from to n-1 stack = 1-stack; Move(i, stack, 2*stack, 2*stack+2); Hanoi(i-1, 1, stack, 2*stack+1, 2*stack, 2*stack+2); 31 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 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 thuật tốn chứng minh qui nạp: cuối chu trình vịng đầu (the top loop), đĩa từ xuống i + đống đĩa (thí dụ, màu đen) cọc tạm thời đĩa từ i + đến n cọc ban đầu Với đống đối diện (màu trắng), đĩa từ xuống đến i cọc tạm thời chúng đĩa i + đến n cọc ban đầu Một tính chất tương tự cho cuối vòng lặp vòng cuối (the bottom loop): đĩa từ đến i − đống cọc tạm thời nó, đĩa i đến đĩa n đặt cọc đích Với đống đối diện, đĩa từ xuống đến i cọc tạm thời nó, đĩa i + đến n đặt cọc đích Từ tính chất suy tất bước chuyển hợp lệ mã (code) cho lời giải trò chơi i −1 i i −1 Lần lặp i vòng đầu (the top loop) tạo + (2 − 1) + + (2 − 1) = 3.2 lần chuyển Tổng cộng 32 n −1 ∑ 3.2 i =1 i −1 = ( + + + 2n− ) = 3(2n − − 1) Vòng lặp cuối (the bottom loop) tạo số lần chuyển số lần chuyển vịng lặp đầu Vì ta cịn có thêm lần chuyển bên ngồi vịng nên tổng số tất lần chuyển 3(2 n−1 − 1) + 3(2n −1 − 1) + = 3(2 n − 1) Thuật toán chuyển nhất, ngoại trừ việc định đĩa đống đĩa di chuyển 2.3.3 Trò chơi tháp Hà Nội đen trắng: Phiên Bài toán: Giả sử ta có s đống đĩa, s ≥ 3, đống chứa n đĩa, đánh số từ đến s − 1, m = s cọc, đánh số từ đến 2s − Các đống đĩa đồng nhất, ngoại trừ màu chúng Như vậy, có s đống đĩa đơi khác màu Lúc đầu đống đĩa thứ i, i = 0, , s − tương ứng nằm cọc 2i Yêu cầu toán là: Đống đĩa thứ i cọc thứ 2i tạm thời sử dụng cọc thứ 2i + 1, phải kết thúc cọc thứ ( 2i + ) Ở tất số rút gọn theo mod(2 s), nghĩa đống đĩa thứ s − cọc thứ 2s − chuyển sang cọc 2s, cọc Như cọc thứ 2i vừa đóng vai trị cọc xuất phát đống đĩa thứ i đồng thời cọc đến đống đĩa thứ i − 1, cọc thứ 2i + sử dụng cho đống thứ i Hình 2.8 phiên cho tốn bốn đống đĩa bốn màu ( s = 4), đống chứa bốn đĩa (n = 4) 33 Hình 2.8 n n −1 Định lí [12] Số bước chuyển tối ưu phiên s ( − 1) + Thuật toán tối ưu giải tốn mơ tả [12] sau Các bước thực hiện: Kỹ thuật đánh ta sử dụng hai phiên không áp dụng cho Phiên 3, phải chuyển liên tiếp đĩa lớn lời giải tối ưu, phải chuyển liên tiếp đĩa nhỏ Tuy nhiên, đống đĩa bị giới hạn phép chuyển ba cọc, n phải chuyển từ cọc đến cọc khác Vì vậy, s (2 − 1) đánh giá Mặt khác, thuật toán tối ưu cho Phiên gợi ý rằng, phiên n cần ( s + 1)(2 − 1) lần chuyển Ta thấy hai Phiên tương đương Phiên trường hợp s = Tuy nhiên n ≥ hai tốn khác nhau, nghiên cứu riêng biệt hai trường hợp s = s ≥ cần thiết Nói riêng, với n ≥ 2, số bước chuyển tối thiểu cho Phiên ( 2n − 1) , lớn số bước tối ưu 5.2n−1 − nhận từ công thức s ( 2n − 1) + 2n−1 s = theo Định lí Điều có nghĩa thuật tốn tối ưu Phiên áp dụng cho Phiên 2, dẫn tới bước chuyển đĩa bị cấm 34 Thuật toán phiên 3: Đối với Phiên 3, có thuật tốn xây dựng nhóm chương trình tương đương (coroutines, xem Thuật toán đây) Ta coi cọc ban đầu đống i (cọc 2i ) cọc Home nó, cọc tạm thời đống i (cọc 2i + ) cọc Run nó, đích đống i (cọc 2i + ) cọc Away Bốn chữ tên chương trình biểu thị theo thứ tự là: chữ cọc mà đĩa đống đĩa nằm vị trí bắt đầu chương trình; cọc mà đĩa đống nằm vị trí kết thúc trương trình; hai chữ cịn lại (ở cuối tên chương trình) ứng với cọc chứa đĩa đống cịn lại Ví dụ, routine HAHR (n, s) có nghĩa là: có s đống đĩa, vào lúc khởi đầu chương trình, n đĩa đứng đầu tất đống đĩa nằm cọc Home chúng Vào cuối chương trình đĩa đống đĩa cọc Away nó, đĩa tất đống lại cọc Run chúng Cũng trước đây, ta giả thiết rằng, thủ tục không thực n không dương, tất tham số i đĩa rút gọn theo modulo Thuật toán: procedure HAHR (n, s) HRHA(n-1, s); for i from to s-1 Move(n, i, (2*i), (2*i+1)); Hanoi(n-1, 1, i, (2*i+2), (2*i), (2*i+1)); Move(n, 0, 0, 2); Hanoi(n-1, 1, 0, 1, 0, 2); procedure HRHA(n, s) 35 HAHR(n-1, s); Move(n, 0, 0, 1); Hanoi(n-1, 1, 0, 2, 0, 1); for i from s-1 down to Move(n, i, (2*i), (2*i+2); Hanoi(n-1, 1, i, (2*i+1), (2*i), (2*i+2)); procedure HARA(n, s) Hanoi(n-1, 1, 0, 0, 2, 1); Move(n, 0, 0, 2); for i from to s-1 Hanoi(n-1, 1, i, (2*i+1), (2*i+2), (2*i)); Move(n, i, (2*i+1), (2*i+2)); procedure RAHA(n, s) for i from s-1 down to Hanoi(n-1, 1, i, (2*i), (2*i+2), (2*i+1))); Move(n, i, (2*i), (2*i+2)); Hanoi(n-1, 1, 0, 1, 2, 0); Move(n, 0, 1, 2); HARA(n-1, s); Tất quy trình tạo số lần chuyển Có thể gọi quy trình từ quy trình này, cộng với s lần chuyển đĩa s lần gọi quy trình Hanoi theo thứ tự Kí hiệu H (n) số lần chuyển đĩa quy trình Khi H (n) = H (n − 1) + s (2n−1 − 1) + s = H (n − 1) + s.2 n −1 Với H (0) = Chứng minh theo quy nạp ta có H (n) = s (2n − 1) 36 Quy trình rõ ràng tối ưu, thực s lần qui trình Tháp Hà Nội cổ điển cách riêng biệt Một lời giải cho Phiên đưa quy trình HAHA Với giả định thông thường n thông số đống đĩa, procedure HAHA (n, s) HAHR(n-1, s); Move(n, 0, 0, 1); for i from s-1 down to Move(n, i, (2*i), (2*i+2)); Hanoi(n-1, 1, 0, 2, 1, 0); Move(n, 1, 2, 4); Move(n, 0, 1, 2); HARA(n-1, s); Qui trình trước tiên gọi hai H-thủ tục, gọi thủ tục Hanoi, s + lần chuyển đĩa Cuối ta tổng cộng M ( n, s ) = s ( 2n − 1) + n−1 lần chuyển Để số lần chuyển tối ưu, ta nhận thấy tất s đĩa kích thước n chuyển trực tiếp từ cọc Home đến cọc Away Ít đĩa (trên đống mã (code) chúng ta) phải chuyển từ cọc Home đến cọc Run nó, sau từ cọc Run đến cọc Away Còn n − đĩa đỉnh đống phải chuyển từ cọc Home đến cọc Away nó, trước lần chuyển đĩa lớn nhất, sau lại trở lại cọc Home lần chuyển đĩa lớn nhất, trở lại cọc Away lần chuyển cuối đĩa lớn thực Vì n −1 n n −1 vậy, đống phải thực 3(2 − 1) + = (2 − 1) + lần chuyển 37 Còn lại s − đống khác phải thực 2n − lần chuyển, tổng M ( n, s ) Sử dụng chương trình HAHR, HARA, Thủ tục Turtle2 cho cách khác để tạo qui trình tối ưu cho Phiên procedure Turtle2(n) HAHR(n-1, 2); Move(n, 0, 0, 1); Hanoi(n-1, 1, 0, 2, 0, 1); Move(n, 1, 2, 0); Hanoi(n-1, 1, 0, 1, 2, 0); Move(n, 0, 1, 2); HARA(n-1, 2); 2.3.4 Trò chơi tháp Hà Nội đen trắng: Phiên Bài toán: Phiên tương tự Phiên gồm hai đống đĩa, có cọc, tức có thêm cọc số mà đĩa màu khác sử dụng cọc q trình chuyển Đĩa trắng sử dụng cọc 0, 1, 2, để chuyển từ cọc sang cọc 2, đĩa đen sử dụng cọc 2, 3, để chuyển từ cọc sang cọc Phiên chất tương tự toán tháp Hà Nội với bốn cọc, thường gọi tốn Reve (Reve’s puzzle), sử dụng cơng thức truy hồi cho tốn bốn cọc trình bày Mục 1.2, tìm thuật toán giả định tối ưu cho toán ta có Định lí [12] Số bước chuyển M (n) giả định tối ưu phiên M (n) = R(n) + R(n − 1) + 2, R (n) số bước chuyển giả định tối ưu toán tháp Hà Nội cho bốn cọc, tính theo cơng thức Định lí Chương 1, Mục 1.2 38 Các bước thực hiện: Có thể xây dựng thuật toán cho Phiên dựa thuật toán di chuyển tối thiểu toán Reve Tương tự tốn Tháp Hà Nội cổ điển, ta mơ tả thuật toán cách đệ quy Đối với n > 0, tính tốn giá trị k Chuyển cách hồi qui (recurcively move) đĩa n − k đỉnh tháp từ cọc ban đầu đến hai cọc tạm thời; sau di chuyển đĩa k đến cọc đích, sử dụng thuật toán Tháp Hà Nội tiêu chuẩn với ba cọc; sau chuyển n − k đĩa đỉnh từ cọc tạm thời đến cọc đích Giá trị k chọn để số lần chuyển Ta biết rằng, k = { 2n} , xem, thí dụ, [4], { x} biểu thị số nguyên gần x Thuật toán phiên 4: Thuật toán cho Phiên 4, mà giả sử tối ưu, sử dụng thủ tục Reve(n) để tạo bước chuyển lời giải giả định tối ưu Ngoài thủ tục không thực n không dương Ta giả sử k số nguyên gần 2n procedure Reve(n, stack, from, via, to, extra) Reve(n-k, stack, from, to, via, extra); Hanoi(n, n-k+1, stack, from, extra, to); Reve(n-k, stack, via, from, to, extra); Sử dụng H-thủ tục Phiên 3, ta có phiên Reve Thí dụ, ta có thủ tục R_HAHR (n) Lưu ý có hai đống đĩa tốn nên khơng có vịng lặp (loop) chu trình procedure R_HRHA(n) R_HAHR(n-k); Hanoi(n, n-k+1, 0, 0, 4, 1); Reve(n-k, 0, 2, 0, 1, 4); 39 Hanoi(n, n-k+1, 1, 2, 4, 0); Reve(n-k, 1, 3, 2, 0, 4); Cuối cùng, ta xây dựng thủ tục R_HAHA Stockmeyer - Lunnon [12] cho Phiên Nó biến thể thủ tục Turtle procedure R_HAHA(n) R_HAHR(n-k); Hanoi(n-1, n-k+1, 0, 0, 4, 1); Reve(n-k, 0, 2, 0, 1, 4); Move(n, 0, 0, 4); Hanoi(n, n-k+1, 1, 2, 4, 0); Move(n, 0, 4, 2); Reve(n-k, 0, 1, 2, 0, 4); Hanoi(n-1, n-k+1, 0, 1, 4, 2); R_HARA(n-k); Ta phân tích cách sơ lược thủ tục sau Giả sử R ( n ) số lần chuyển lời giải tối ưu toán Reve, thể chu trình Reve Ta thấy R ( n ) = R ( n − k ) + 2k − Phương trình truy hồi có nghiệm R ( n ) = ( k − 1) 2k − ( với k số nguyên gần k (k + 1) − n)2 k −1 + , 2n Mỗi qui trình R_HAHR thực bước chuyển toán Reve hai đống đĩa, với tổng số 2R ( n ) lần chuyển Trong thủ tục 40 R_HAHA, đĩa đống thực tổng cộng R ( n ) lần chuyển, k đĩa đống thực tổng cộng R ( n − k ) + lần chuyển Có thể rằng, biểu thức cuối R (n − 1) + Như lời giải cho Phiên có tổng cộng M (n) = R (n) + R (n − 1) + lần chuyển 41 KẾT LUẬN Luận văn trình bày tổng quan tốn tháp Hà Nội với đĩa màu Những vấn đề thực luận văn là: 1) Tìm hiểu trình bày thuật tốn chương trình giải phiên khác toán tháp Hà Nội với đĩa màu 2) Khai thác chương trình phần mềm giải hiển thị thuật toán giải toán tháp Hà Nội với đĩa màu 3) Chứng minh Định lí nêu Đề cương số bước chuyển đĩa tối ưu số lời giải tối ưu 42 TÀI LIỆU THAM KHẢO [1] Dudeney H E (1907), The Reve’s Puzzle, The Canterbury Puzzles (and other curious problems), Thomas Nelson and Sons, Ltd., London [2] Dunkel O (1941), Editorial note concerning advanced problem 3918, Amer Math Monthly 48, 219 [3] Frame J S (1941), Solution to advanced problem 3918, Amer Math Monthly 48 , 216-217 [4] Hinz A M (2013), Sandi Klavzˇar, Uroš Milutinovic´, Ciril Petr, The Tower of Hanoi–Myths and Maths, Springer, Basel [5] Lucas E (1889), Nouveaux Jeux Scientifiques de M E’duard Lucas, 301-303 [6] Lucas E (1889), Jeux Scientifiques, Primière Série, No3, La Tour d’Hanoi, Chambon & Baye/ Éduard Lucas, Paris [7] Lucas E (1895), L’Arithméique Amusante: Introduction aux Récréations Mathematicques, Gauthier-Villars, Paris, pp 179-183 [8] Majumdar A A K (2012), (2013) A classical Tower of Ha noi: Problems and its Generalizations, Vol 1, Vol 2, Lambert [9] Stewart B M (1939) , Advanced problem 3918, Amer Math Monthly 46, 363 [10] Stewart B M (1941), Solution to advanced problem 3918, Amer Math Monthly 48, 217-219 [11] Stockmeyer P K (1994), Variations on the four–post Tower of Hanoi puzzle, Congr Numer 102, 3–12 (Proceedings of the 25th Southeastern International Conference on Combinatorics, Graph Theory and Computing) 43 [12] P K Stockmeyer, Lunnon F (2010), New variations on the Tower of Hanoi, Congressus Numerantium 201, 277-287 [13] Symposium La “Tour d’Hanoi” − un casse − tete mathématique d’E’duard Lucas (1842-1891), Institute Henri Poincaré, Paris 2009 [14] Workshop on the Tower of Hanoi and Related Problems, September 18 – September 22, 2005, Maribor, Slovenia 44 ... với n 1.2 Bài toán tháp Hà Nội với nhiều cọc Một mở rộng tự nhiên toán Tháp Hà Nội với ba cọc Bài toán Tháp Hà Nội với bốn (hoặc nhiều) cọc Chính tác giả toán Tháp Hà Nội, E Lucas người xét toán. .. tháp Hà Nội với nhiều cọc 1.1 Bài toán tháp Hà Nội cổ điển Năm 1883 nhà toán học người Pháp Édouard Lucas (1842–1891) phát minh truyền bá trò chơi tháp Hà Nội Trị chơi (Bài tốn) tháp Hà Nội cổ... chơi Tháp Hà Nội xoay vòng, trò chơi Tháp Hà Nội với đĩa màu, ) Những tổng quát hóa cải biên dẫn đến vấn đề tốn học thú vị, chí dẫn tới nhiều tốn chưa có lời giải Luận văn Bài toán Tháp Hà Nội với