Vacaciones de invierno 2020 [gmoj1597] [GDKOI2004] [Torre de Hanoi Hanoi] [Problema de la torre Hanuo]

Descripción del título

El viejo problema de la torre de Hanoi es el siguiente: mueva los discos N con radios desiguales de la columna n. ° 1 a la columna n. ° 3 con el número mínimo de pasos. Durante el movimiento, el disco pequeño siempre debe estar en el mercado grande Arriba Ahora agregue una condición más: no está permitido mover el disco directamente de la columna No. 1 a la columna No. 3, ni está permitido mover el disco directamente de la columna No. 3 a la columna No. 1. Numere los discos de 1 a N según el radio de pequeño a grande. Cada estado está representado por N enteros, y el entero número i representa el número de la columna donde se encuentra el dial i. Entonces, el esquema de movimiento cuando N = 2 es: (1,1) => (2,1) => (3,1) => (3,2) => (2,2) => (1,2) => (1,3) => (2,3) => (3,3) El estado inicial es el paso 0, programa para encontrar el estado en un cierto número de pasos.

De entrada

La primera línea del archivo de entrada es un entero T (1 <= T <= 50000), que indica el número de grupos de datos de entrada. En las siguientes líneas T, cada línea tiene dos enteros N, M (1 <= n <= 19,0 <= M <= el número de pasos necesarios para mover N discos).

Salida

El archivo de salida tiene líneas T. Para cada conjunto de datos de entrada, la salida de N enteros indica el estado del movimiento de N discos en pasos M. Cada dos números están separados por un espacio, y no debe haber espacios adicionales al principio y al final de la línea.

Entrada de muestra

4
2 0
2 5
3 0
3 1

Salida de muestra

1 1
1 2
1 1 1
2 1 1

Análisis

Este es un problema regular.
Se puede encontrar que el movimiento del primer disco es 1,2,3,3,2,1. Entonces el segundo conjunto es 1,1,1,2,2,2,3,3,3,2,2,2,1,1,1. Y así sucesivamente: el número de veces de cada i-ésimo disco es 3 i-1 . Enumere 1 ~ n para obtenerlo. Complejidad temporal O (n * t).
Encontrar patrones es muy fácil ...

Código en

#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
int t,n,m,a[6]={1,2,3,3,2,1};//a数组从0开始存 
int main()
{
	freopen("hanoi.in","r",stdin);
	freopen("hanoi.out","w",stdout);
    cin>>t;
    for(int i=1;i<=t;i++)
    {
    	scanf("%d%d",&n,&m);
    	for(int i=1;i<=n-1;i++)
    	{
    		printf("%d ",a[m%6]);
    		m/=3;//每次变化持续长度
		}
		cout<<a[m%6];
		printf("\n");
	}
	fclose(stdin);
	fclose(stdout);
    return 0;
}

110 artículos originales publicados · 100 alabanzas · 8014 visitas

Supongo que te gusta

Origin blog.csdn.net/dglyr/article/details/105057483
Recomendado
Clasificación