2010-05-20 29 views
7

thể trùng lặp:
How does this work? Weird Towers of Hanoi SolutionTháp lặp của Hà Nội này hoạt động như thế nào? C

Trong khi lướt Google, tôi tìm thấy giải pháp thú vị này đến Tháp Hà Nội mà thậm chí không sử dụng ngăn xếp như cấu trúc dữ liệu.

Ai đó có thể giải thích ngắn gọn về tôi, nó thực sự đang làm gì?

Giải pháp này có thực sự chấp nhận được không?

#include <stdio.h> 
#include <stdlib.h> 

int main() 
{ 
    int n, x; 
    printf("How many disks?\n"); 
    scanf("%d", &n); 
    printf("\n"); 
    for (x=1; x < (1 << n); x++) 
     printf("move from tower %i to tower %i.\n", 
     (x&x-1)%3, ((x|x-1)+1)%3); 
return 0; 
} 

Cập nhật: các mã hóa cứng số 3 làm ở đây là gì?

+2

Đang sử dụng thanh chuẩn 3. –

+1

Báo cáo có đúng trình tự di chuyển không? Nếu vậy, nó hoạt động, và không có lý do tại sao nó không được chấp nhận. Tuy nhiên, bạn cần phải hiểu nó trước khi cung cấp nó như là một giải pháp cho bài tập ở nhà của bạn, hoặc bạn sẽ gặp rắc rối nếu bạn được kêu gọi để giải thích nó, vì bạn có thể rất tốt vì nó rất khác so với bình thường. –

+0

Nó không phải là bài tập về nhà của tôi. Tôi chỉ vô tình tìm thấy thuật toán này và nghĩ rằng nó sẽ hoạt động như thế nào. – TCM

Trả lời

11

Có thể dễ dàng nhìn thấy trong mã giả:

GET NUMBER OF DISKS AS n 
WHILE x BETWEEN 1 INCLUSIVE AND 1 LEFT-SHIFTED BY n BITS 
    SUBTRACT 1 FROM n, DIVIDE BY 3 AND TAKE THE REMAINDER AS A 
    OR x WITH x-1, ADD 1 TO THAT, DIVIDE BY 3 AND TAKE THE REMAINDER AS B 
    PRINT "MOVE FROM TOWER " A " TO TOWER " B 
    ADD 1 TO x 

1 LEFT dịch đi n BITS là về cơ bản 2 với sức mạnh của n, 16 trong trường hợp của 4 đĩa.

If you walk through this sequence manually, you should see the progression of movement of the disks. http://library.ust.hk/images/highlights/Tower_of_Hanoi_4.gif

+0

Cảm ơn Harvey, mã giả này thực sự dễ hiểu :). Câu trả lời chính xác ! – TCM

+2

Uh, "GIỮA 1 VÀ n" không giống như "cho (x = 1; x <(1 << n); x ++)" –

+1

@David: Cảm ơn, đã sửa. –

6

Đây là một trong những giải pháp nhị phân cho Tháp Hà Nội, có giải thích chi tiết về thuật toán này trên Wikipedia - đọc the "Binary solution" paragraph.

Các vấn đề liên quan