Classifique o array bidimensional embaralhado preenchido com números trocando os números adjacentes [fechado]

9

Uma matriz bidimensional do tamanho n × n é preenchida com n * n números, iniciando no número 1. Esses números devem ser classificados por linha em ordem crescente; o primeiro número de uma linha deve ser maior que o último número da linha anterior (o menor número de todos (1) estará em [0,0]). Isso é semelhante ao quebra-cabeça 15 .

Essa é, por exemplo, uma matriz classificada de tamanho n = 3 .

1 2 3
4 5 6
7 8 9

Entrada

A entrada é uma matriz codificada. Pode ser de qualquer tamanho, até n = 10. Exemplo para n = 3:

4 2 3
1 8 5
7 9 6

Resultado

Saída uma lista de trocas necessárias para classificar a matriz. Um swap é definido da seguinte forma: Dois números adjacentes trocam de posição, horizontal ou verticalmente; troca diagonal não é permitida.

Exemplo de saída para o exemplo acima:

  • Troque 4 e 1
  • Swap 8 e 5
  • Swap 8 e 6
  • Swap 9 e 8

Quanto menos trocas necessárias, melhor. O tempo de computação deve ser viável.


Aqui está outro exemplo de entrada, com n = 10:

41 88 35 34 76 44 66 36 58 28
6 71 24 89 1 49 9 14 74 2
80 31 95 62 81 63 5 40 29 39
17 86 47 59 67 18 42 61 53 100
73 30 43 12 99 51 54 68 98 85
13 46 57 96 70 20 82 97 22 8
10 69 50 65 83 32 93 45 78 92
56 16 27 55 84 15 38 19 75 72
33 11 94 48 4 79 87 90 25 37
77 26 3 52 60 64 91 21 23 7

Se não me engano, isso exigiria cerca de 1000-2000 swaps.

JCarter
fonte
Esse é um problema de quebra-cabeça, velocidade ou golfe?
Michael Klein
@MichaelKlein Este é um quebra-cabeça.
precisa saber é
É marcado? Quais intervalos precisam ser manipulados?
Michael Klein
11
@steveverrill Acho que é impossível resolver o exemplo n = 10 em menos de 100 swaps (ou até 1000; mas por favor, prove que estou errado). Ainda assim, o número de swaps é o critério de vencimento (embora a computação deva ser viável!), Quem encontrar uma solução com o menor número de swaps vencerá.
precisa saber é
11
@JCarter Acho que você quis dizer que apenas números adjacentes podem ser trocados?
quintopia 18/01/16

Respostas:

3

Mathematica, não jogou golfe

towards[a_,b_]:={a,a+If[#==0,{0,Sign@Last[b-a]},{#,0}]&@Sign@First[b-a]};
f[m_]:=Block[{m2=Map[QuotientRemainder[#-1,10]+1&,m,{2}]},
  Rule@@@Apply[10(#1-1)+#2&,#,{2}]&@
    Reap[Table[
      m2=NestWhile[
        Function[{x},x/.(Sow[#];Thread[#->Reverse@#])&[x[[##]]&@@@towards[First@Position[x,i,{2}],i]]]
        ,m2,#~Extract~i!=i&];
      ,{i,Reverse/@Tuples[Range[10],2]}];][[2,1]]]

Explicação :

O algoritmo é semelhante ao "tipo de bolha". Esses 100 números são colocados na ordem correta, um por um 1, 11, 21, ..., 91; 2, ..., 92; ...; 10, ..., 100,. Eles são movidos primeiro para cima / baixo nas linhas corretas e depois movidos para a esquerda para as colunas corretas.

Função towardsfornece as duas posições para trocar. Por exemplo, se {5,2}está se movendo para {1,1}, towards[{5,2},{1,1}]{{5,2},{5,1}}(sobe); e towards[{5,1},{1,1}]{{5,1},{4,1}}(mova para a esquerda).


Resultados :

Para o caso de teste, o número total de swaps é 558. Os primeiros swaps são,

{1->76,1->34,1->35,1->88,1->41,11->16,11->69,11->46, ...

Para uma configuração aleatória, o número total de swaps é 558,5 ± 28,3 (1σ).

insira a descrição da imagem aqui

njpipeorgan
fonte