ハノイ非再帰の塔(スタック)

ハノイ非再帰の塔(スタック)

アメリカの学者は法律を見つける:偶数、A、B、Cの時計回りの順、そうでない場合は、C、Bの配置は、その後、繰り返し行われた場合:

(1)移動は最小限に時計回り

(2)最小値を移動させるための2つの列は、次いで直接シフトは空

非再帰的スタック(環状)ハノイの塔問題解決モード(N、A、B、C)を用いて、Nは列によって(「」と名付けられた)プレートカラムから開始しようとしている(ラベル「B」)ターゲットカラム(「C」と表示)、各移動満たしているハノイの塔の要件を確保します。

入力フォーマット:

入力はN、すなわち、ディスクの開始列番号整数正です。

出力フォーマット:

各操作に応じてライン毎(移動)、柱1 -> 柱2出力のフォーマット。

サンプル入力:

3

出力例:

a -> c
a -> b
c -> b
a -> c
b -> a
b -> c
a -> c

米国。人々は、再帰的ながたの書き込みを見て、それ

#include<iostream>
#include<cstdio>
#include<stack>
#include<cmath>
using namespace std;
int main()
{
//  freopen("test.in","r",stdin);
    //freopen("test.out","w",stdout);
    int n,num=0,pan1,now;
    long long times;
    char a[3];
    stack <int> ta[3];
    cin>>n;
    for (int i=n;i>=1;i--)
      ta[0].push(i);
    now=0;
    if (n%2==1)
    {
        a[0]='a';
        a[1]='c';
        a[2]='b';
    }
    else
    {
        a[0]='a';
        a[1]='b';
        a[2]='c';
    }
    times=pow(2,n)-1;
    while (num<times)
    {
        num++;
        pan1=ta[now].top();
        ta[now].pop();
        ta[(now+1)%3].push(pan1);
        printf("%c -> %c\n",a[now],a[(now+1)%3]);
        num++;
        if (num>times)
          break;
        if (ta[now].size()!=0 and (ta[(now+2)%3].size()==0 or ta[now].top()<ta[(now+2)%3].top()))
        {
            ta[(now+2)%3].push(ta[now].top());
            ta[now].pop();
            printf("%c -> %c\n",a[now],a[(now+2)%3]);
        }
        else
        {
            ta[now].push(ta[(now+2)%3].top());
            ta[(now+2)%3].pop();
            printf("%c -> %c\n",a[(now+2)%3],a[now]);
        }
        now=(now+1)%3;
    }
    return 0;
}

おすすめ

転載: www.cnblogs.com/IamIron-Man/p/11956998.html