Torre de Hanoi, fácil de entender

Torre de Hanoi

Hay tres pines en una placa, A, B, C. Hay 64 discos de diferentes tamaños en la aguja A, el más grande en la parte inferior y el pequeño en la parte superior. Hay un viejo monje que quiere mover estos 64 discos de la aguja A a la aguja C. Solo se puede mover un disco a la vez, y el movimiento se puede realizar con la ayuda de la aguja B. Pero en cualquier momento, cualquier disco de la aguja debe mantener el disco grande hacia abajo y el pequeño hacia arriba. Encuentra los pasos para moverte.

La idea de la resolución de problemas es así.

En primer lugar, el viejo monje lo piensa de esta manera. Si alguien me puede ayudar a mover las 63 placas de arriba de una a otra, el problema estará resuelto. El viejo monje solo necesita hacer en este momento:

  • Ordene al segundo monje que mueva 63 placas de A a B
  • Mueva la placa inferior de A a C usted mismo
  • Luego ordene al segundo monje que mueva 63 placas de B a C

Luego, el segundo monje encontrado descubrirá cómo mover 63 placas de A a B, y luego buscará otro monje para ayudar. Lo que el segundo monje debe hacer en este momento es:

  • Ordene al tercer monje que mueva 62 platos de A a C
  • Mueva 1 plato de A a B usted mismo
  • Luego ordene al tercer monje que mueva 62 platos de C a B

Después de realizar un proceso recursivo, encontraremos al monje número 63 y dejaremos que termine de mover las dos placas de una a la otra (porque la posición inicial que debe moverse cambiará cada vez que comience el movimiento, así que aquí también estoy No estoy seguro ), finalmente encontró al monje número 64, que termine de mover un plato de uno a otro, el trabajo está completamente terminado.

Análisis de algoritmos de esta pregunta

Suponga que hay n placas en A.
Si n = 1, mueva el disco de A a C directamente.
Si n = 2, entonces:
1. Mueva n-1 (igual a 1) discos de
A a B; 2. Mueva un disco de A a C;
3. Finalmente, mueva el disco a B n-1 (igual a 1 ) los discos se mueven a C.
Si n = 3, entonces:
A. Mueva n-1 (igual a 2, sea n )个圆盘移到 B(借助于 C),步骤如下: (1)将 A 上的 n-1 (igual a 1) discos de A a C.
(2) Mueva un disco de A a B.
(3) Mueva los n -1(等于 1)个圆盘移到 B。 B. 将 A 上的一个圆盘移到 C。 C. 将 B 上的 n-1(等于 2,令其为 n) discos de C a C (con A), los pasos son los siguientes:
(1) Mueva n -1(等于 1)个圆盘移到 A。 (2)将 B 上的一个盘子移到 C。 (3)将 A 上的 n-1 (igual a 1) discos de B a C.
En este punto, se completa el movimiento de los tres discos.
Puede verse en el análisis anterior que cuando n es mayor o igual a 2, el proceso de movimiento se puede descomponer en tres pasos: el
primer paso es mover n-1 discos de
A a B; el segundo paso es mover uno de A en El disco se mueve a C; el
tercer paso es mover los n-1 discos de B a C; el primer y tercer paso son similares.
Cuando n = 3, el primer y tercer paso se descomponen en tres pasos similares, es decir, n -1 个圆盘从一个针移到另一 个针上,这里的 n= n-1. Obviamente este es un proceso recursivo, según el cual el algoritmo se puede programar de la siguiente manera

#include<stdio.h>
void hanoi(int n,char A,char B,char C){
    
    //找到第一个和尚,他需要做的A->B
	if (n == 1){
    
    //别人帮第一个和尚把除了最底下的一个所有都移好了之后,
		//      自己把最底下的那个放过去
		printf("Move %d:from %c to %c\n",n,A,B);
	}
	else{
    
    
		hanoi(n - 1, A, C, B);//第一个和尚找到第二个和尚,他需要A->C,
		                      //这个时候函数参数的位置发生了变化
		printf("Move %d:from %c to %c\n", n, A, B);
		hanoi(n-1,C,B,A);//第二个和尚再把C->B
	}
}
void main(){
    
    
	int n;
	char A = 'A';
	char B = 'B';
	char C = 'C';
	printf("输入几个圆盘:");
	scanf("%d", &n);
	printf("A座到B座\n");
	hanoi(n, A, B, C);
}

Supongo que te gusta

Origin blog.csdn.net/weixin_45070922/article/details/109903810
Recomendado
Clasificación