Feriado de inverno 2020 [gmoj1597] [GDKOI2004] [Torre de Hanói Hanói] [Problema da torre Hanuo]

Descrição do título

O antigo problema da torre de Hanói é o seguinte: mova os discos N com raios desiguais da coluna nº 1 para a coluna nº 3. com o número mínimo de etapas Durante o movimento, o disco pequeno sempre deve estar no mercado grande Acima. Agora, adicione mais uma condição: não é permitido mover o disco diretamente da coluna nº 1 para a coluna nº 3, nem é permitido mover o disco diretamente da coluna nº 3 para a coluna nº 1. Numere os discos de 1 a N de acordo com o raio de pequeno a grande. Cada estado é representado por N números inteiros e o i-ésimo número inteiro representa o número da coluna em que o dial i está localizado. Então o esquema móvel quando N = 2 é: (1,1) => (2,1) => (3,1) => (3,2) => (2,2) => (1,2) => (1,3) => (2,3) => (3,3) O estado inicial é o 0º passo, programa para encontrar o estado em um certo número de passos.

Entrada

A primeira linha do arquivo de entrada é um número inteiro T (1 <= T <= 50000), indicando o número de grupos de dados de entrada. Nas próximas linhas T, cada linha possui dois números inteiros N, M (1 <= n <= 19,0 <= M <= o número de etapas necessárias para mover N discos).

Saída

O arquivo de saída possui T. linhas. Para cada conjunto de dados de entrada, a saída de N inteiros indica o estado dos discos N em movimento nas etapas M. Cada dois números são separados por um espaço e não deve haver espaços extras no início e no final da linha.

Entrada de amostra

4
2 0
2 5
3 0
3 1

Saída de amostra

1 1
1 2
1 1 1
2 1 1

Análise

Este é um problema regular.
Pode-se descobrir que o movimento do primeiro disco é 1,2,3,3,2,1. Então o segundo conjunto é 1,1,1,2,2,2,3,3,3,2,2,2,1,1,1. E assim por diante: o número de vezes que cada i-ésimo disco é 3 i-1 . Enumere 1 ~ n para obtê-lo. Complexidade temporal O (n * t).
Encontrar padrões é muito fácil ...

Código ativado

#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;
}

Publicado 110 artigos originais · 100 elogios · 8014 visitas

Acho que você gosta

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