Ordina matrice bidimensionale rimescolata piena di numeri scambiando i numeri adiacenti [chiuso]


9

Un array bidimensionale di dimensioni n × n è riempito con n * n numeri, a partire dal numero 1. Tali numeri devono essere ordinati per riga in ordine crescente; il primo numero di una riga deve essere maggiore dell'ultimo numero della riga precedente (il numero più piccolo di tutti (1) sarà in [0,0]). Questo è simile al puzzle 15 .

Questo è, ad esempio, un array ordinato di dimensioni n = 3 .

1 2 3
4 5 6
7 8 9

Ingresso

L'input è un array criptato. Può avere qualsiasi dimensione fino a n = 10. Esempio per n = 3:

4 2 3
1 8 5
7 9 6

Produzione

Emette un elenco di swap necessari per ordinare l'array. Uno scambio è definito come segue: Due numeri adiacenti scambiano posizioni, sia in orizzontale che in verticale; lo scambio diagonale non è consentito.

Esempio di output per l'esempio sopra:

  • Scambia 4 e 1
  • Scambia 8 e 5
  • Scambia 8 e 6
  • Scambia 9 e 8

Meno swap sono necessari, meglio è. Il tempo di calcolo deve essere fattibile.


Ecco un altro esempio di input, con 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 non sbaglio, ciò richiederebbe circa 1000-2000 swap.


È un problema di puzzle, velocità o golf?
Michael Klein,

@MichaelKlein Questo è un puzzle.
JCarter,

È segnato? Quali intervalli devono essere gestiti?
Michael Klein,

1
@steveverrill Temo che sia impossibile risolvere l'esempio n = 10 in meno di 100 swap (o anche 1000; ma per favore, dimostrami che mi sbaglio). Tuttavia, il numero di swap è il criterio vincente (anche se il calcolo deve essere fattibile!), Vince chi trova una soluzione con il minor numero di swap.
JCarter,

1
@JCarter Penso che intendevi dire che solo i numeri adiacenti possono essere scambiati?
Quintopia,

Risposte:


3

Mathematica, non golf

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]]]

Spiegazione :

L'algoritmo è simile a "bubble sort". Questi 100 numeri sono messi nell'ordine corretto uno per uno 1, 11, 21, ..., 91; 2, ..., 92; ...; 10, ..., 100,. Vengono prima spostati su / giù nelle righe corrette, quindi spostati a sinistra nelle colonne corrette.

La funzione towardsfornisce le due posizioni da scambiare. Ad esempio, se {5,2}si sta spostando su {1,1}, towards[{5,2},{1,1}]{{5,2},{5,1}}(sposta su); e towards[{5,1},{1,1}]{{5,1},{4,1}}(sposta a sinistra).


Risultati :

Per il caso di test, il numero totale di swap è 558. I primi pochi swap sono,

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

Per una configurazione casuale, il numero totale di swap è 558,5 ± 28,3 (1σ).

inserisci qui la descrizione dell'immagine

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.