ホームページ > 記事 > コンピューターのチュートリアル > ハノイの塔問題を解決する C 言語プログラムの書き方
実際には、次の 3 つの主要な手順があります:
まず、a 上の n-1 個のディスクを b から c に移動します。
次に、a の一番下の円盤を c に移動します。
第三に、最初の n-1 個のプレートはすべてピラー b 上にあるため、ピラー b をピラー a として扱い、上記の手順を繰り返すだけで済みます。
####含む######パズルの解き方を学びましょう。パズル中にプレートを移動する機能を使用できます。関数のプロトタイプは「void move(int n, char a, char b, char c)」です。関数内で再帰を使用してプレートを移動できます。プレートの数 n と 3 つの柱 a、b、c の識別子を指定することで、プレートを柱 a から柱 c に順番に移動できます。再帰についての考え
if(n==1)
printf("\t%c->%c\n", a, c); // プレートが 1 枚だけの場合、プレートを a から c に直接移動します。 ###それ以外###
{
まだレベルをクリアしていないプレイヤーを助けるために、具体的なパズルの解決方法について学びましょう。パズルを解くプロセスでは、再帰的メソッドを使用できます。具体的な操作は次のとおりです。 1. n-1 番目のプレートを柱 a から柱 c に移動します: move(n-1, a, c, b); 2. n 番目のプレートを柱 a から柱 b に移動します。 3. n
を追加します。まだパズルを解いていないプレイヤーを助けるために、次のコードを使用して問題を解決できます: printf("\t%c->%c\n",a,c);
このレベルをまだクリアしていないプレイヤーを助けるために、パズルを解くための具体的な手順を見てみましょう。まず、最初の n-1 個のプレートを列 B から列 A に移動して、列 B を開始列にし、次に列 B のプレートを列 A を経由して列 C に移動します。
}
}
int main()
{
int n;
printf ("移動するブロックの数を入力してください:");
scanf("%d",&n);
move(n,'a','b','c');
0を返す;
}
C 言語を使用してハノイの塔ゲームをコンパイルする
昨日作ったばかりです。
#include
void hanoi(int n,char 1,char 2,char 3);void hanoi(int n,char 1,char two,char 3) { void move(char x,char y); if(n==1) move(one,three); else { hanoi(n-1) ,one,three,two); move(one,three); ハノイ(n-1,two,one,three); } }
羅漢塔をC言語でプログラムする方法
ここでコメントを読むことができます:
私のプログラムは以下のとおりです:
{
TopPoint[FromTa] は、各タワー レベルの高さを記録する配列です。タワーから要素が削除されると、タワーの高さは 1 単位減少します。この配列の目的は、各タワーの現在の高さを追跡できるようにすることです。
この問題を解決するには、次のコードを使用して 3 つのタワーのデータを記録し、そのデータを 1 つのタワーから別のタワーに移動します。 「」パイソン DuiZhan[ToTa][TopPoint[ToTa]] = DuiZhan[FromTa][TopPoint[FromTa]] 「」 このコード行は、移動されたタワーの最上部 (FromTa) からデータを取得し、それを移動されたタワーの最上部 (ToTa) に転送します。このようにして、タワー上でデータを記録および移動できます。
DuiZhan[FromTa][TopPoint[FromTa]] = 0; //最初に移動したタワーの最上位レベルを null 値に戻します。ここで、まだレベルをクリアしていないプレイヤーに役立つ具体的なパズルの解決方法を見てみましょう。
まだレベルをクリアしていないプレイヤーを助けるために、具体的なパズルの解決方法について学びましょう。重要な手順の 1 つは、タワーをターゲットの場所に移動することです。具体的な操作は、コード「TopPoint[ToTa];」を使用して、ターゲット タワーのフロア数を 1 つ増やすことです。このステップはパズルを解くプロセスの重要な部分であり、これにより誰もがスムーズにレベルをクリアできることを願っています。
}
void Nuo(int FromTa, int MidTa, int ToTa, int NeedMove) 関数は、ハノイの塔問題の主な解決策です。この関数を使用して、初期条件と塔の高さを考慮してハノイの塔の問題を解くことができます。
{
具体的な謎解き方法を見ていきましょう。移動する必要があるタワーの高さが 2 階以上の場合、次の操作を行うことができます:
{
Nuo(FromTa, ToTa, MidTa, (NeedMove-1)); //最初に、一番下の N-1 を除くすべての上位 N-1 を中央のタワーに移動します。このステップは、関数を再帰的に呼び出すことで実現されます。 パズル中、プレートを移動するには 3 つのタワー (FromTa、ToTa、MidTa) を使用する必要があります。まず、上位 N-1 プレートを FromTa から MidTa に移動します (関数を再帰的に呼び出すことで実装されます)。次に、底板を FromTa から ToTa に移動します。最後に、MidTa 上の N-1 プレートを ToTa に移動します (これも再帰転送を使用します
NuoYiWei(FromTa,ToTa); //開始タワーからターゲットタワーまで底板を移動します。
Nuo(MidTa,FromTa,ToTa,(NeedMove-1)); //最後に、中央のタワーに移動した N-1 個のアイテムをすべてターゲット タワーに移動します (この関数がこの関数を達成できると仮定します)
}
###それ以外###{
まだレベルをクリアしていないプレイヤーを助けるために、具体的なパズルの解決方法について学びましょう。移動する必要があるブロックが 1 つだけ残っている場合は、それを移動してください。
}
}
この関数は C で書かれています。C 言語を使用する場合は、いくつかの詳細に注意する必要があることに注意してください。
C 言語で書かれたハノイの塔プログラムがあります。必要な場合は、sxt9840210@163.com に電子メールを送って、必要なプログラムの種類を明確に説明してください。
ハノイ塔の C 言語アルゴリズム
再帰的アルゴリズムの中心的な考え方は、解の目標を開始点として使用し、初期条件である再帰の境界に到達するまで、独自の解法プロセスを徐々に呼び出して未知の項目を解決することです。この方法は従来の初期条件から始める方法とは異なりますが、問題を解決する効果的な方法の 1 つです。再帰的アルゴリズムを通じて、複雑な問題を徐々に単純な部分問題に分解し、最終的に全体的な答えを得ることができます。再帰の鍵は、再帰の境界を明確にし、再帰プロセスが正しく実行できるようにすることです
ハノイ塔問題を解決する鍵は、動きのルールを分析し、パターンを見つけ、境界条件を決定することにあります。
n 個のプレートを A から C に移動する場合は、次の手順に従うことができます: (1) n-1 個のプレートを A から B に移動; (2) n 番目のプレートを A から C に移動; (3) n-1 枚のプレートを B から C に移動します。この関数を再帰的に呼び出すことにより、境界条件 n=1 に達するまで、A 上の他のプレートは上記の 3 つのステップに従って移動し続けることができます。このようにして、タスクは正常に完了することができます。このパズル方法がまだレベルをクリアしていないプレイヤーに役立つことを願っています。
思考が明確になると、プログラムは理解しやすくなります。プログラムでは、移動関数が呼び出されるたびにパラメーターを分析し、タワー A、B、C の関係を分析することが重要です。以下に実際的な例を示して説明しましょう。
まだパズルを解いていないプレイヤーを助けるために、パズルの解き方を詳しく見てみましょう。まず、「move(int n, int x, int y, int z)」関数を使用して移動操作を実行できます。
②{
③ if (n==1)
まだレベルをクリアしていないプレイヤーを助けるために、具体的なパズルの解決方法について学びましょう。次の手順を用意しました。 1. まず、printf という名前の関数を見つけます。 2. 次に、printf 関数のかっこ内に「%c-->%c\n」と入力します。これにより、2 文字が出力され、行が折り返されます。 3. 括弧内で、x と z を引数として printf 関数に渡します。
⑤その他
⑥ {
⑦ move(n-1,x,z,y);
プレイヤーがレベルをクリアできるように、具体的なパズルの解決方法を見てみましょう。コードには、「printf("%c-->%c\n",x,z);」というコード行があります。このコード行の機能は、文字 x と文字 z の関係を出力することです。印刷された結果を観察することで、パズルを解くためのヒントを得ることができます。
⑨ {getchar();}//この文は必要ですか?削除できそうな気がします
⑩ move(n-1,y,x,z);
}
}
たとえば、4 つのプレートがあり、現在それらはすべてタワー A に配置されています。 1、2、3、4 の数字に応じてプレートの半径が大きくなります。次に、4 つのプレートを C に移動し、元の順序で並べます。まず、4番をCに移す方法を考えます。 B を仲介者として使用し、まず上記 3 つを B に移動する必要があります。このステップの動作としては、プログラム中の①がmove関数の呼び出しを開始します(最初の呼び出しは1として記録されます) もちろん、今はn=4ですが、その後は③n!=1と判断されるので、④は成立しません。実行されましたが、⑤が再び呼び出されます ( 2 つとしてマークされています) 3 つのディスクを B に移動する方法を検討します。これは再帰呼び出しなので、再び①に戻ってmove関数の呼び出しを開始しますが、今回は4枚のディスクをAからCに移動するのではなく、Aからどのように移動するかを考慮する必要があるため、対応するパラメータが変更されています。 3 つのディスクを B に移動します。 n=3 なので直接移動することはできず、C を仲介する必要があるので、まず 2 つを C に移動する方法を考えて、⑤に進み、move 関数を再帰的に呼び出します (3 とマーク)。同様に、2 つのディスクを A から C に直接移動することはできません。そのため、B を仲介として 1 を B に移動するプロセスを考慮する必要があります。今回はBを仲介として利用し、目的としてCに移動します。次に、move 関数を再帰的に呼び出します (4 つとマークされています)。これは B に移動することを意味します。これは直接実行できます。プログラムは文③と文④を実行し、一番内側の呼び出しから飛び出て(つまり4回目の呼び出しから飛び出て)、前の呼び出し(3回目)に戻り、3回目の呼び出しからmove関数まで下に進みます。 、つまり ⑧、つまり 2 C に移動し、
まで続きます。⑩、B に移動したものを C に移動し、2 回目の再帰 (C を媒介として 3 つのディスクを B に移動したとき) に戻ります。 ⑧を実行し、3番目のディスクをAからBに移動し、⑩を入力します。この呼び出しでは、C上の2つのディスクがAを介してBに移動されるため、パラメータ転送に対応する別の再帰呼び出しが必要です。誰が元のタワーで、誰がターゲットタワーで、誰が仲介タワーなのかを明確に分析します。このプロセスは上記の分析と似ているため、ここでは繰り返しません。
以上がハノイの塔問題を解決する C 言語プログラムの書き方の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。