Как работает эта итеративная башня Ханоя? В C [дубликат]

Возможные Дубликаты:
как это работает? Странные башни Ханоя решение

во время серфинга в Google я нашел это интересное решение для Tower of Hanoi, которое даже не использует стек в качестве структуры данных.

это решение приемлемо?

код

#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;
}

обновление: Что здесь делает закодированный номер 3?

2 ответов


может быть проще увидеть в псевдокоде:

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 левое смещение на n бит в основном равно 2 в степени n, 16 в случае 4 дисков.

если вы пройдете через эту последовательность вручную, вы должны увидеть прогрессию движения дисков. http://library.ust.hk/images/highlights/Tower_of_Hanoi_4.gif


Это одно из бинарных решений башни Ханоя, есть подробное объяснение этого алгоритма в Википедии - читать пункт "двоичное решение".