인접한 숫자를 교체하여 숫자로 채워진 스크램블 된 2 차원 배열 정렬 [닫힘]


9

nxn 크기의 2 차원 배열은 숫자 1부터 n * n 숫자로 채워집니다.이 숫자는 행당 오름차순으로 정렬됩니다. 행의 첫 번째 숫자는 이전 행의 마지막 숫자보다 커야합니다 (모두 가장 작은 숫자는 [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 100 스왑 미만 (또는 1000까지도 n = 10 예제를 해결하는 것이 불가능합니다. 그러나 나를 잘못 증명하십시오). 그럼에도 불구하고, 스왑의 수는 가장 많은 수의 스왑 수를 가진 솔루션을 제시하는 승리 기준입니다 (계산은 가능해야합니다!).
JCarter

1
@JCarter 나는 당신이 인접한 숫자들만 교환 될 수 있다고 말하려고했다고 생각합니까?
quintopia

답변:


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, 11, 21, ..., 91; 2, ..., 92; ...; 10, ..., 100. 먼저 올바른 행으로 위 / 아래로 이동 한 다음 올바른 열로 왼쪽으로 이동합니다.

기능 towards은 교체 할 두 위치를 제공합니다. 예를 들어, {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.