【C言語】グラフィック解析、ハノイの塔問題の簡単な解説

ここに画像の説明を挿入

Junxi_ の個人ホームページ

勤勉であり、誰も待たないように何年も費やすことを奨励してください

C/C++ ゲーム開発


こんにちは、Junxi_ です。今日は、ずっと更新したいと思っていましたが書く時間がなく、ハノイの塔問題を更新します。ハノイの塔問題は、再帰に関する問題の中でも最も古典的な問題の 1 つです。ハノイの塔問題の核心をしっかりと理解できれば、再帰の問題はそれほど悪くないと言えます。今日は、ハノイの塔問題を簡単に説明します。

ハノイの塔とは何ですか?

  • ハノイの塔は、古代インドの伝説に登場するゲームに由来しており、ブラフマーが世界を創造したとき、3 本のダイヤモンドの柱を作り、1 つの柱の上に 64 枚の金の円盤を下から上に大きさ順に積み上げました。ブラフマーはバラモンに、別の柱の上にある円盤を下から大きさの順に並べ替えるよう命じました。そして、小さな円盤では円盤を拡大することはできず、移動の際には3本の柱の間で一度に1枚の円盤しか移動できないと規定されている。

ハノイタワーを実現するC言語

ハノイ問題に対する具体的な思考分析の解決策

  • ハノイ塔問題に関する上記の説明から、次のような結論を導き出すことができます。

  • A 列のすべてのプレートを C 列に移動する場合は、次のルールに従ってください。

  • 1. A ピラー上部のプレートは一度に 1 枚だけ移動できます

  • 2.小​​プレートではプレートを拡大することはできません。

ステップごとに分析してみましょう。まず、現時点で A に n 個のプレートがあるとします。今の目標は、B 列の助けを借りて、A 上のすべてのプレートを C 列に移動することです。

n=2 枚のプレートを A 上で移動する必要がある場合

  • 簡単すぎて絵は描きません!
  • A の一番上のプレートを B に移動し、次に A のもう一方のプレートを C に移動し、最後に B のプレートを C に移動するだけです。

n=3 枚のプレートを A 上で移動する必要がある場合

ここに画像の説明を挿入

  • 2枚のプレートをAからBに移動します。n=2 の場合に手順を繰り返します。今回は、C の助けを借りて、これら 2 つのプレートを A から B に移動します。

ここに画像の説明を挿入

  • 次に、A のディスクを C に移動します。
    ここに画像の説明を挿入
  • 2枚のプレートをBからCに移動します。n=2 の場合に手順を繰り返します。今回は、A を使用してこれら 2 つのプレートを B から C に移動します。
    ここに画像の説明を挿入

n=4 のプレートを A 上で移動する必要がある場合

ここに画像の説明を挿入

  • 3枚の皿をAからBに移動します。n=3 の場合も手順を繰り返します。n=3 との違いは、C を使用して A 上のプレートを B に移動することです。
    ここに画像の説明を挿入

  • A の最後のプレートを C に移動します
    ここに画像の説明を挿入

  • 3枚のプレートをBからCに移動します。n=3 の場合も手順を繰り返します。n=3 との違いは、A を使用して B 上のプレートを C に移動することです。
    ここに画像の説明を挿入

A上で移動する皿の枚数がn枚の場合

  • どうでしょう、以上の説明でパターンが見えてきましたか?
  • つまり、1 より大きい任意の正の整数 n について、n 層のハノイ タワー問題がある場合、それを 2 つの n-1 層のハノイ タワー問題に分解して解くことができます。

ハノイの塔問題を実装するコード

  • 上記の分析を通じて、この問題は次の 3 つのステップとして考えることができます。

  • 1. Aのn-1層プレートをB、Cを経て移動します。

  • 2. この時点で、A にある残りのディスクを C に移動します。

  • 3. B のレイヤー n-1 のプレートを A を経由して C に移動します。


  • 参照コードは次のとおりです。
#include<stdio.h>

void Move (char A, char C, int n)
{
    
    
	printf("把第%d个盘子从%c--->%c\n", n, A, C);
}

void HanoiTower(char A, char B, char C, int n)
{
    
    
	if (n == 1)
	{
    
    
		Move(A, C, n);
	}
	else
	{
    
    
		//将n-1个盘子从A柱借助于C柱移动到B柱上
		HanoiTower(A, C, B, n - 1);
		//将A柱最后一个盘子移动到C柱上
		Move(A, C, n);
		//将n-1个盘子从B柱借助于A柱移动到C柱上
		HanoiTower(B, A, C, n - 1);
	}
}

int main()
{
    
    
	int n = 0;
	printf("输入A柱子上的盘子个数:");
	scanf("%d", &n);
	//将n个盘子从A柱借助于B柱移动到C柱上
	HanoiTower('A', 'B', 'C', n);
	return 0;
}

ここに画像の説明を挿入


要約する

  • 今日の内容は一旦ここで終わります 今日はハノイの塔問題を再帰的に解決しました。まだ疑問がある場合は、自分で試してみる必要があります。そうしないと、非常に忘れやすく、見ただけで理解するのが非常に難しいので、慣れるために繰り返し練習する必要があります。

  • 質問がございましたら、コメント欄またはプライベート メッセージでお問い合わせください。また次回お会いしましょう。

新しいブロガーを作成するのは簡単ではありません。記事の内容が役立つと思われる場合は、離れる前にこの新しいブロガーをクリックするとよいでしょう。皆様の応援が更新の励みになります!

**(Ke Li はブロガーを 3 回連続でサポートするようお願いしています!!! 以下のコメントをクリックして「いいね」を押し、Ke Li を支援するために集めてください)**

ここに画像の説明を挿入

おすすめ

転載: blog.csdn.net/syf666250/article/details/131462720