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