ハノイの塔
タイトルの説明
次の条件でのハノイの塔の問題:
4つの塔A、B、C、Dがあります。
これがディスクです。数は一定です。
各ディスクのサイズは異なります。
最初はすべてのディスクがタワーAに積み重ねられており、ディスクのサイズはタワーの上部から下部に向かって徐々に大きくなります。
すべてのディスクをタワーAからタワーDに転送する必要があります。
一度に1枚のディスクを移動できます。タワーが空の場合、または上部のディスクのサイズが移動したディスクよりも大きい場合、ディスクをタワーに移動できます。すべてのディスクをタワーAからタワーDに移動するために必要な最小移動数を確認してください。
入力フォーマット
入力なし。
出力形式
1≤n≤12の整数ごとに、条件を満たす最小移動数を出力し、各結果は1行を占めます。
問題解決のアイデア
まず、3つのタワーがあるハノイの塔の問題を考えます。a(n)がn個のプレートと3個のタワーの最適なステップ数を示しているとします。最初にn-1個のプレートをBピラーに移動する必要があります。最適なステップ数は次のとおりです。 d(n-1)、次にAピラーの残りのプレートをCピラーに移動します。ステップ数は1です。最後に、Bピラーのn-1プレートをCピラーに移動します。これは最適なステップ数です。 Is a(n-1)でもあります。したがって、漸化式があります:
a(n)= 2 ∗ a(n − 1)+ 1 a(n)= 2 * a(n-1)+1a (n )=2∗a (n−1 )+1
この質問に戻り、f(n)がn個のプレートと4個のタワーの最適なステップ数を表すとします。j個のプレートをA列からB列に移動することを検討します。最適なステップ数はf(j)であり、次にnjプレートをDピラーに移動します。Bピラーにすでにプレートがあることを考慮すると、3タワーモードでの最適なステップ数はa(nj)です。最後に、jプレートをBに移動します。ステップまたf(j)。すべてのjを考慮する
for(int i=2;i<=12;i++)
a[i]=a[i-1]*2+1;
for(int i=2;i<=12;i++)
{
f[i]=2147483647;
for(int j=1;j<=i;j++)
f[i]=min(f[i],f[j]*2+a[i-j]);
}
ACコード
#include<cstdio>
#include<algorithm>
using namespace std;
int a[15],f[15];
int main()
{
a[1]=1;
for(int i=2;i<=12;i++)//初值
a[i]=a[i-1]*2+1;
f[1]=1;
printf("1\n");
for(int i=2;i<=12;i++)//递推
{
f[i]=2147483647;
for(int j=1;j<=i;j++)
f[i]=min(f[i],f[j]*2+a[i-j]);
printf("%d\n",f[i]);
}
return 0;
}