C/C++再帰アルゴリズムを用いてハノータを実現
1238 ワード
ハノータの原理解析:
皿が一つしかない場合は、Aタワーの上の皿からCタワーに移すだけです.
Aタワーに2つの皿がある場合は、まずAタワーの上の1番皿(番号を上から下に)をBタワーに移動し、Aタワーの上の2番皿を移動するCタワーに、最後にBタワーの上の小皿をCタワーに移動します.
Aタワーに3つの皿がある場合は、まずAタワーの番号1から2の皿(計2個)をBタワー(Cタワーを借りる必要がある)に移動し、その後、Aタワーの3番の最大の皿をCタワーに移動し、最後にBタワーの2つの皿をAタワーを介してCタワーに移動する.
Aタワーにn個の皿がある場合は、まずAタワーの番号1からn-1の皿(合計n-1個)をBタワー(Cタワーを借りて)に移動し、その後、Aタワーの最大のn号皿をCタワーに移動し、最後にBタワーのn-1の皿をAタワーを借りてCタワーに移動する.
以上のように、皿が1つしかない場合は他の塔を借りる必要がない以外は、いずれも同じである.
皿が一つしかない場合は、Aタワーの上の皿からCタワーに移すだけです.
Aタワーに2つの皿がある場合は、まずAタワーの上の1番皿(番号を上から下に)をBタワーに移動し、Aタワーの上の2番皿を移動するCタワーに、最後にBタワーの上の小皿をCタワーに移動します.
Aタワーに3つの皿がある場合は、まずAタワーの番号1から2の皿(計2個)をBタワー(Cタワーを借りる必要がある)に移動し、その後、Aタワーの3番の最大の皿をCタワーに移動し、最後にBタワーの2つの皿をAタワーを介してCタワーに移動する.
Aタワーにn個の皿がある場合は、まずAタワーの番号1からn-1の皿(合計n-1個)をBタワー(Cタワーを借りて)に移動し、その後、Aタワーの最大のn号皿をCタワーに移動し、最後にBタワーのn-1の皿をAタワーを借りてCタワーに移動する.
以上のように、皿が1つしかない場合は他の塔を借りる必要がない以外は、いずれも同じである.
#include
using namespace std;
int hannuota(int n,string a,string b,string c)
{
if(n==1)
{
//
printf(" %s------> %s
",a.c_str(),c.c_str());
}
else{
//1. n-1
hannuota(n-1,a, c, b);
//2.
printf(" %s------> %s
",a.c_str(),c.c_str());
//3.
hannuota(n-1, b, a, c);
}
return 1;
}
int main(int argc, const char * argv[]) {
printf(" :
");
int n;
scanf("%d",&n);
printf(" :
");
hannuota(n,"A","B","C");
return 0;
}