1

リニア タワーズ オブ ハノイについて質問があります。

私は C++ で実装しましたが、末尾再帰または反復法を使用して同じことをしようとしています。アルゴリズムに問題があります。

このコード スニペットは、ブロックをミドル タワーからエンド タワーに転送する方法を示しています。

#include <stdlib.h>
#include <stdio.h>
using namespace std;

//int a[5]={2,3,1,2,1};
int from,spare,to;

int main()
{
//int n;

//void hanoi(int,int,int,int);
void linear_hanoi(int,int,int,int);
void mid_to_end(int,int,int,int);
void end_to_mid(int,int,int,int);
//mid_to_end(3,2,3,1);
end_to_mid(4,3,2,1);
getchar();
return 0;
}

void linear_hanoi(int n, int from, int to, int spare)
{
     if(n>0)
      {
            linear_hanoi(n-1,from,to,spare);
            cout<<"move ring "<<n<<" from tower "<<from<<" to tower "<<spare<<endl;
            linear_hanoi(n-1,to,from,spare);
            cout<<"move ring "<<n<<" from tower "<<spare<<" to tower "<<to<<endl;
            linear_hanoi(n-1,from,to,spare);
      }
}
void mid_to_end(int n, int from, int to, int spare)
{
  if(n>0)
  {
     mid_to_end(n-1,from,spare,to);
     cout<<"move ring "<<n<<" from tower "<<from<<" to tower "<<to<<endl;
    // mid_to_end(n-1,spare,from,to);
   //  mid_to_end(n-1,from,to,spare);
   //cout<<"move ring "<<n<<" from tower "<<spare<<" to tower "<<from<<endl;
  // mid_to_end(n-1,from,to,spare);
    //cout<<"move ring "<<n<<" from tower "<<spare<<" to tower "<<from<<endl;
 }
}

私は何を間違っていますか?

4

2 に答える 2

1

ウィキペディアから:

簡単な解決策: 次の解決策は、おもちゃのパズルの簡単な解決策です。

最小のピースと最小でないピースの間を交互に移動します。最小の駒を動かすときは、必ず同じ方向に動かしてください(最初の駒の数が偶数の場合は右に、最初の駒の数が奇数の場合は左に)。選択した方向に塔がない場合は、ピースを反対側の端に移動しますが、正しい方向に移動し続けます. たとえば、3 つのピースから始めた場合、最小のピースを反対側の端に移動し、その後左方向に進みます。ターンが最小でないピースを移動する場合、正当な移動は 1 つだけです。これを行うと、最小限の移動でパズルを完成させることができます。

于 2009-10-20T21:35:59.557 に答える
0

コードを継続渡しスタイルに変換できます。次に、すべてが末尾再帰です...

于 2009-11-27T20:50:39.413 に答える