Сортувати скремблированний двовимірний масив, заповнений числами, замінюючи сусідні числа [закритий]


9

Двовимірний масив розміром n × n заповнюється n * n числами, починаючи з числа 1. Ці числа слід сортувати за рядом у порядку зростання; перше число рядка має бути більшим за останнє число попереднього рядка (найменше число всіх (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 свопів.


Це проблема головоломки, швидкості чи гольфу?
Майкл Кляйн

@MichaelKlein Це головоломка.
JCarter

Чи забито? Які діапазони потрібно обробляти?
Майкл Кляйн

1
@steveverrill Я боюся, що неможливо вирішити приклад n = 10 менш ніж за 100 свопів (або навіть 1000; але, будь ласка, доведіть мене неправильно). Але все-таки кількість свопів є критерієм виграшу (хоча обчислення повинно бути здійсненним!), Виграє той, хто придумає рішення з найменшою кількістю свопів.
JCarter

1
@JCarter Я думаю, ти мав намір сказати, що можуть змінюватися лише суміжні номери?
Кінтопія

Відповіді:


3

Математика, не гольф

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σ).

введіть тут опис зображення

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.