【C语言】汉诺塔问题的解决办法(附图)

1.游戏规则

汉诺塔(Hanoi)游戏是在一块铜板装置上,有三根杆(编号A、B、C),在A杆自下而上、由大到小按顺序放置64个盘子。游戏的目标:把A杆上的盘子全部移到C杆上,并仍保持原有顺序叠好。操作规则:每次只能移动一个盘子,并且在移动过程中三根杆上都始终保持大盘在下,小盘在上。操作过程中盘子可以置于A、B、C任一杆上。

根据汉诺塔游戏的介绍我们可以得出两条重要的规则:

1.一次只能移动一个盘子

2.在移动的过程中我们要保证三根杆上的盘子大盘在下,小盘在上(即由上到下从小到大排列)

2.思路解析

1.当只有一个盘子的时候,我们只需将这一个盘子移到最后一根柱子即可解决问题。

2.当有两个盘子的时候:

初始情况是这样的【C语言】汉诺塔问题的解决办法(附图)_第1张图片

依据规则中的:在移动过程中三根杆上都始终保持大盘在下,小盘在上。我们可以得出在解决问题前的一个步骤所展示的情况如下【C语言】汉诺塔问题的解决办法(附图)_第2张图片

3.当有三个盘子的时候,初始情况如下:

【C语言】汉诺塔问题的解决办法(附图)_第3张图片

 依据规则,我们在将最大的盘子移动到 C 柱的时候,其他两个盘子的情况应该是是这样的:

【C语言】汉诺塔问题的解决办法(附图)_第4张图片

 然后我们再将盘子按照规则依次移动使得三个盘子有序的放在 C 柱上

【C语言】汉诺塔问题的解决办法(附图)_第5张图片

以此类推我们可以发现,假设有n个盘子,当最大的盘子移动到C柱上的时候,n-1个盘子都有序的放在B柱上,而第(n-1)个柱子要做的是将盘子通过A柱(中转柱),从B柱(初始柱)移动到C柱(最终柱),当移动完成后我们又会发现剩下(n-2)个盘子有序的放在B柱上。根据这个规律,我们可以写出代码

	Hanoi(n - 1, pos1, pos3, pos2);
	move(pos1, pos3);
	Hanoi(n - 1, pos2, pos1, pos3);

即我们先将(n-1)个盘子从初始柱A通过中转柱C移动到最终柱B后,将第n个盘子从A柱移动到C柱,然后再将(n-1)个柱子执行上述的指令即可解决问题。 

3.最终代码

我们首先定义一个函数来实现我们盘子移动的功能:

void move(char pos1, char pos2)
{
	printf("%c -> %c\t", pos1,pos2);
}

接着我们定义一个解决问题的函数:

void Hanoi(int n,char pos1, char pos2, char pos3)
{
	if (n == 1)
	{
		move(pos1, pos3);
	}
	else
	{
		Hanoi(n - 1, pos1, pos3, pos2);
		move(pos1, pos3);
		Hanoi(n - 1, pos2, pos1, pos3);
	}
}

最后我们通过主函数来实现他

int main()
{
	Hanoi(3,'A','B','C');
	return 0;
}

 完整代码如下:

#include
void move(char pos1, char pos2)
{
	printf("%c -> %c\t", pos1,pos2);
}

void Hanoi(int n,char pos1, char pos2, char pos3)
{
	if (n == 1)
	{
		move(pos1, pos3);
	}
	else
	{
		Hanoi(n - 1, pos1, pos3, pos2);
		move(pos1, pos3);
		Hanoi(n - 1, pos2, pos1, pos3);
	}
}



int main()
{
	Hanoi(3,'A','B','C');
	return 0;
}

运行结果如下

【C语言】汉诺塔问题的解决办法(附图)_第6张图片

 以上就是汉诺塔问题的解析和代码实现

你可能感兴趣的:(C语言学习心得,c语言)