隣接する数値を交換することにより、数値で満たされたスクランブルされた2次元配列を並べ替える[クローズ]


9

サイズn×nの2次元配列は、番号1から始まるn * nの数値で埋められます。これらの数値は、行ごとに昇順でソートされます。行の最初の数は、前の行の最後の数より大きくなければなりません(すべて(1)の最小数は[0,0]になります)。これは15パズルに似ています。

これは、たとえば、サイズn = 3のソートされた配列です。

1 2 3
4 5 6
7 8 9

入力

入力はスクランブル配列です。n = 10までの任意のサイズにすることができます。n= 3の例:

4 2 3
1 8 5
7 9 6

出力

配列のソートに必要なスワップのリストを出力します。スワップは、以下のように定義される:二つの隣接する数字は水平方向または垂直方向、位置を入れ替えます。対角スワッピングは許可されていません。

上記の例の出力例:

  • スワップ4と1
  • スワップ8と5
  • スワップ8と6
  • スワップ9と8

必要なスワップが少ないほど良いです。計算時間は実現可能でなければなりません。


次に、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

私が間違っていなければ、これには約1000〜2000回のスワップが必要になります。


これはパズル、スピード、またはゴルフの問題ですか?
Michael Klein

@MichaelKleinこれはパズルです。
JCarter

得点はありますか?どの範囲を処理する必要がありますか?
Michael Klein

1
@steveverrill n = 10の例を100スワップ(または1000未満)で解決することは非常に不可能です。それでも、スワップの数が勝ちの基準です(ただし、計算は可能でなければなりません!)、スワップの数が最も少ないソリューションを見つけた人が勝ちです。
JCarter

1
@JCarter私はあなたが隣接する数字だけが交換されるかもしれないと言うつもりだったと思いますか?
クイントピア

回答:


3

Mathematica、ゴルフではない

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

説明

アルゴリズムは「バブルソート」に似ています。これらの100個の数字は、1つずつ正しい順序に並べられます1, 11, 21, ..., 91; 2, ..., 92; ...; 10, ..., 100。それらはまず正しい行に上下に移動し、次に正しい列に左に移動します。

関数towardsは2つの位置を入れ替えます。たとえば、{5,2}がに移動する場合{1,1}、(上に移動)towards[{5,2},{1,1}]を与え{{5,2},{5,1}}ます。と towards[{5,1},{1,1}]与える{{5,1},{4,1}}(左に移動)。


結果

テストケースの場合、スワップの総数は558です。最初のいくつかのスワップは、

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

ランダム構成の場合、スワップの総数は558.5±28.3(1σ)です。

ここに画像の説明を入力してください

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.