SORU
5 ŞUBAT 2010, Cuma


Nasıl oluyor bu iş? Hanoi Çözüm garip Kuleleri

Hanoi kuleleri this sıradışı, yinelemeli çözüm keşfettim internette kayboldum:

  for (int x=1; x < (1 << nDisks); x  )
  {
       FromPole = (x&x-1)%3;
       ToPole = ((x|x-1) 1)%3;
       moveDisk(FromPole,ToPole);
  }

This post cevaplar birinde benzer Delphi kodu var.

Ancak, beni hayat için, bu işleri neden iyi bir açıklama bulmak için görünmüyor olabilir.

Kimse bana bu anlamanıza yardımcı olabilir?

CEVAP
6 ŞUBAT 2010, CUMARTESİ


özyinelemeli çözüm kuleleri Hanoi çalıştığı istiyorsanız, hareket N disklerinden Bir tahta C, ilk hareket N-1-A, B, o zaman sizi en alttaki C, ve sonra hareket tekrar N-1 disk B C. özü

hanoi(from, to, spare, N):
  hanoi(from, spare, to, N-1)
  moveDisk(from, to)
  hanoi(spare, to, from, N-1)

Açıkça hanoi( _ , _ , _ , 1) alır, hanoi ( _ , _ , _ , k) alır gibi birçok hamle olarak 2 * hanoi( _ , _ , _ , k-1) 1. Yani çözüm uzunluğu büyür dizisi 1, 3, 7, 15, ... Bu aynı sırası (1 << k) - 1, hangi açıklar uzunluğu döngü algoritması yayınlanmıştır.

Eğer bu çözümleri kendileri bakarsanız, N = 1 olsun

FROM   TO
          ; hanoi(0, 2, 1, 1)
   0    2    movedisk

N = 2 olsun

FROM   TO
          ; hanoi(0, 2, 1, 2)
          ;  hanoi(0, 1, 2, 1)
   0    1 ;   movedisk
   0    2 ;  movedisk
          ;  hanoi(1, 2, 0, 1)
   1    2 ;   movedisk

Ve N = 3 olsun

FROM   TO
          ; hanoi(0, 2, 1, 3)
          ;  hanoi(0, 1, 2, 2)
          ;   hanoi(0, 2, 1, 1)
   0    2 ;    movedisk
   0    1 ;   movedisk
          ;   hanoi(2, 1, 0, 1)
   2    1 ;    movedisk
   0    2 ;  movedisk ***
          ;  hanoi(1, 2, 0, 2)
          ;   hanoi(1, 0, 2, 1)
   1    0 ;    movedisk
   1    2 ;   movedisk
          ;   hanoi(0, 2, 1, 1)
   0    2 ;    movedisk

Çünkü özyinelemeli doğanın çözümü, ve sütunlar izleyin bir özyinelemeli mantık: eğer size orta giriş sütunları, parçaları yukarıda ve aşağıda kopya birbirlerinin, ama sayıları permuted. Bu peg sayı üzerinde herhangi bir aritmetik işlemi yok ama sadece onları permutes olan algoritma açık bir sonucu. Bu durumda N=4 orta satırda ise x=4 (üç yıldızdan ile işaretli).

Şimdi (X & (X-1)) X en az set bit ISE seçeneği, örneğin sayılar haritaları çok ifade bu gibi 1 7 form:

   1 ->  0
   2 ->  0
   3 ->  2
   4 -> 0 (***)
   5 ->  4 % 3 = 1
   6 ->  4 % 3 = 1
   7 ->  6 % 3 = 0

Hile olduğunu çünkü orta sıra her zaman bir tam iki güç ve bu nedenle tam olarak bir bit, bir parçası sonra, orta sıra eşit kısmı daha önce eklediğinizde orta sıra değerini (4 Bu durumda) satır (yani 4=0 4, 6=2 6). Bunu uygulayan "kopya" özelliği, orta satır uygular ayrıca permütasyon bölümü. İfade (X | (X-1)) 1 beklendiği gibi benzer özelliklere sahiptir, bu yüzden onun için doğru olanları vardır, ve bunlar temizler, en düşük sıfır bitini ayarlar,:

   1 ->  2
   2 ->  4 % 3 = 1
   3 ->  4 % 3 = 1
   4 -> 8 (***) % 3 = 2
   5 ->  6 % 3 = 0
   6 ->  8 % 3 = 2
   7 ->  8 % 3 = 2

Bu dizileri aslında doğru peg sayılar üretmek için neden, hadi sütun düşünün. Özyinelemeli çözüm ile başlar ve hanoi(0, 2, 1, N), O yüzden orta sıra (2 ** (N-1)) olmalı movedisk(0, 2). Şimdiye kadar yineleme kuralı, (2 ** (N-2)) sana ihtiyacımız var movedisk(0, 1) ve (2 ** (N-1)) 2 ** (N-2) movedisk (1, 2). Bu oluşturur "0,0,1" desen için mandal görülebilir farklı değişikliklerle yukarıdaki tabloda onay (satır 2, 4 ve 6 için 0,0,1 ve satır 1, 2, 3 0,0,2, satır 5, 6, 7 1,1,0, tüm permuted versiyonlar aynı desen).

Şimdi kendi kopyalarını oluşturmak için bu özelliği tüm fonksiyonları iki güç ama uzaklıklar ile çevresinde, yazarlar modül 3 üreten bu doğru permütasyon seçmiş. Bu üç tamsayı 0..2 sadece 6 farklı olasılık var, çünkü açıkça zor bir görev değil permütasyon algoritması mantıksal bir düzen içinde ilerleme. (X|(X-1)) 1 değil mutlaka derinden bağlantılı olan Hanoi sorun ya da değil ihtiyacı olan o kadar o var Kopyalama özelliği ve çözüm üretmek için doğru permütasyon doğru sipariş.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Kontor.TV

    Kontor.TV

    14 Mart 2006
  • MrChiCity3

    MrChiCity3

    14 NİSAN 2008
  • paulandstorm

    paulandstorm

    4 EYLÜL 2006