Bitişik sayıları değiştirerek numaralarla dolu şifreli iki boyutlu diziyi sırala [kapalı]


9

N × n boyutunda iki boyutlu bir dizi, 1 numaradan başlayarak n * n sayılarıyla doldurulur. Bu sayılar her satırda artan sırada sıralanır; bir satırın ilk sayısı önceki satırın son sayısından fazla olmalıdır (en küçük (1) sayı [0,0] olacaktır). Bu 15 bulmacanınkine benzer .

Bu, örneğin, n = 3 boyutunda sıralanmış bir dizidir .

1 2 3
4 5 6
7 8 9

Giriş

Girdi karıştırılmış bir dizidir. N = 10'a kadar herhangi bir boyutta olabilir. N = 3 örneği:

4 2 3
1 8 5
7 9 6

Çıktı

Diziyi sıralamak için gereken takasların bir listesini çıktılar . Bir takas aşağıdaki gibi tanımlanır: İki bitişik sayı, yatay veya dikey olarak takas konumlarını; diyagonal değiştirmeye izin verilmez.

Yukarıdaki örnek için örnek çıktı:

  • 4 ve 1'i değiştir
  • 8 ve 5'i değiştir
  • 8 ve 6'yı değiştir
  • 9 ve 8'i değiştir

Ne kadar az takas gerekli olursa o kadar iyidir. Hesaplama süresi uygun olmalıdır.


İşte n = 10 ile başka bir örnek girdi:

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

Yanılmıyorsam, bu yaklaşık 1000-2000 takas gerektirir.


Bu bir bulmaca, hız veya golf problemi mi?
Michael Klein

@MichaelKlein Bu bir bilmecedir.
JCarter

Puanlandı mı? Hangi aralıkların ele alınması gerekir?
Michael Klein

1
@steveverrill Korkarım n = 10 örneğini 100'den az takasta (hatta 1000; ancak lütfen bana yanlış olduğunu kanıtlayın) çözmek imkansız. Yine de, takas sayısı kazanan kriterdir (hesaplama mümkün olsa da!), En düşük takas sayısına sahip bir çözüm bulan kazanır.
JCarter

1
@JCarter Sanırım sadece bitişik sayıların değişebileceğini mi söylüyorsunuz?
quintopia

Yanıtlar:


3

Mathematica, golf değil

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

Açıklama :

Algoritma "kabarcık sıralama" ya benzer. Bu 100 sayı birer birer doğru sıraya konur 1, 11, 21, ..., 91; 2, ..., 92; ...; 10, ..., 100. Önce doğru satırlara yukarı / aşağı, sonra da doğru sütunlara sola hareket ederler.

İşlev towards, değiştirilecek iki konumu verir. Örneğin, {5,2}taşınıyor {1,1}, towards[{5,2},{1,1}]verir {{5,2},{5,1}}(yukarı hareket); ve towards[{5,1},{1,1}]verir {{5,1},{4,1}}(sola hareket et).


Sonuçlar :

Test durumu için toplam takas sayısı 558'dir. İlk birkaç takas,

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

Rastgele bir yapılandırma için, toplam takas sayısı 558.5 ± 28.3'tür (1σ).

resim açıklamasını buraya girin

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.