Сортування матриці


12

Давайте визначимо не порожню, несортовану та кінцеву матрицю з унікальними числами наступним чином:

N={457136}

Дозволяє визначити 4 матричні ходи як:

  • ↑ * (вгору): переміщує стовпчик вгору
  • ↓ * (вниз): переміщує стовпчик вниз
  • → * (праворуч): переміщує рядок праворуч
  • ← * (зліва): переміщує рядок ліворуч

Зірочка (*) відображає стовпчик / рядок, на який впливає переміщення (може бути 0-індексованим або 1-індексованим. До вас. Будь ласка, вкажіть, який у вашій відповіді).


Завдання полягає в тому, щоб, використовуючи вищезазначені рухи, сортувати матрицю за порядком висхідних (найменший верхній лівий кут, а нижній правий кут - найвищий).

Приклад

Введення: Можливий вихід: або . (Зверніть увагу, що будь-який з цих рухів може сортувати матрицю, щоб обидва відповіді були правильними)

N={423156}
↑0↓0


Введення: Можливий вихід:

N={231456}
→0


Введення (Приклад тестового випадку): Можливий вихід:

N={457136}
↑0↑1←1↑2


Введення: Можливий вихід:

N={596824173}
↑0↑2→0→2↑0→2↑1↑2←1


Введення: Можливий вихід:

N={127282961023451778139151112181426162119203022232425}
↑2↑1←3→0←3↓0←0←2→3↑3↑4


Введення: Вихід: або будь-який хід

N={1}


Введення: Вихід:

N={1234}


Примітки

  • Можуть бути різні правильні виходи (не потрібно обов’язково бути однаковими, як тестові випадки чи найкоротші)
  • Можна припустити, що це завжди буде спосіб замовити матрицю
  • Edges з'єднує (як pacman: v)
  • Там не буде матриця з більш ніж 9 стовпцями або / та рядками
  • Припустимо, матриця містить лише додатні ненульові цілі числа
  • Ви можете використовувати будь-які 4 різних значення, окрім чисел, для представлення рухів (у випадку цього, будь ласка, зазначте це у своїй відповіді)
  • Стовпець / рядок може бути індексовано 0 або 1
  • Критерії виграшу

Додаткові тестові справи завжди вітаються


5
Ось веб-сайт, де ви можете вирішити ці пазли самостійно.
Дверна ручка

1
@Doorknob Це було б корисно, коли я писав виклик Dx. Все одно, дякую!
Luis felipe De

Я не думаю, що ви ніде говорите, що рішення повинно бути якомога коротшим. Це навмисно? Наприклад, є ←0←0правильним рішенням для другого прикладу, де ви дали рішення як →0. Якщо це так, я думаю, що половина варіантів переміщення, ймовірно, не буде використана.
FryAmTheEggman


1
Також деякі люди можуть спробувати openprocessing.org/sketch/580366, зроблений ютубом під назвою carykh. Це називається "петля"
Гарет Ма

Відповіді:


3

JavaScript (ES6),  226  219 байт

Брутний пошук сили, використовуючи рухи вправо ( "R") та вниз ( "D").

Повертає або рядок, що описує ходи, або порожній масив, якщо вхідна матриця вже сортована. Стовпці та рядки у висновку 0-індексуються.

f=(m,M=2)=>(g=(s,m)=>m[S='some'](p=r=>r[S](x=>p>(p=x)))?!s[M]&&m[0][S]((_,x,a)=>g(s+'D'+x,m.map(([...r],y)=>(r[x]=(m[y+1]||a)[x])&&r)))|m[S]((_,y)=>g(s+'R'+y,m.map(([...r])=>y--?r:[r.pop(),...r]))):o=s)([],m)?o:f(m,M+2)

Спробуйте в Інтернеті!

Прокоментував

f =                              // f = main recursive function taking:
(m, M = 2) => (                  //   m[] = input matrix; M = maximum length of the solution
  g =                            // g = recursive solver taking:
  (s, m) =>                      //   s = solution, m[] = current matrix
    m[S = 'some'](p =            // we first test whether m[] is sorted
      r =>                       // by iterating on each row
        r[S](x =>                // and each column
          p > (p = x)            // and comparing each cell x with the previous cell p
        )                        //
    ) ?                          // if the matrix is not sorted:
      !s[M] &&                   //   if we haven't reached the maximum length:
      m[0][S]((_, x, a) =>       //     try all 'down' moves:
        g(                       //       do a recursive call:
          s + 'D' + x,           //         append the move to s
          m.map(([...r], y) =>   //         for each row r[] at position y:
            (r[x] =              //           rotate the column x by replacing r[x] with
              (m[y + 1] || a)[x] //           m[y + 1][x] or a[x] for the last row (a = m[0])
            ) && r               //           yield the updated row
      ))) |                      //
      m[S]((_, y) =>             //     try all 'right' moves:
        g(                       //       do a recursive call:
          s + 'R' + y,           //         append the move to s
          m.map(([...r]) =>      //         for each row:
            y-- ?                //           if this is not the row we're looking for:
              r                  //             leave it unchanged
            :                    //           else:
              [r.pop(), ...r]    //             rotate it to the right
      )))                        //
    :                            // else (the matrix is sorted):
      o = s                      //   store the solution in o
)([], m) ?                       // initial call to g(); if we have a solution:
  o                              //   return it
:                                // else:
  f(m, M + 2)                    //   try again with a larger maximum length

Гарна відповідь. Чи знаєте ви, чи існує ефективна альго для цього, чи можливо визначити максимальну кількість рухів, яке може мати рішення, без грубої форсировки?
Йона

1
@Jonah Ось документ, що описує рішення та дає верхню межу кількості ходів. (Дивіться також цей виклик, який є в основному тим самим завданням з різним критерієм перемоги.)
Арнольд,

Ого, дякую @Arnauld
Jonah

2

Python 2 , 296 277 245 Python 3 , 200 194 байт

from numpy import*
def f(p):
 s='';u=[]
 while any(ediff1d(p)<0):u+=[(copy(p),s+f'v{v}',f':,{v}')for v in r_[:shape(p)[1]]]+[(p,s+'>0',0)];p,s,i=u.pop(0);exec(f'p[{i}]=roll(p[{i}],1)')
 return s

Спробуйте в Інтернеті!

-19: стрілки Unicode не потрібні були ...
-32: трохи перероблені, але в середньому значно менші показники.
-45: взяв деяке натхнення у відповіді @ Арнольда. Переключено на Python 3 на f''(-4 байти)
-6: range( )r_[: ] , diff(ravel( ))ediff1d( )


Вичерпно шукає комбінації всіх можливих рухів і →0. Час очікується на третьому тестовому випадку.

Так →nяк еквівалентно

01...↓(c-1) 	... repeated r-n times
0
01...↓(c-1)	... repeated n times

де rі cє числа рядків і стовпців, цих ходів достатньо, щоб знайти кожне рішення.


from numpy import*
def f(p):
    s=''                                    #s: sequence of moves, as string
    u=[]                                    #u: queue of states to check
    while any(ediff1d(p)<0):                #while p is not sorted
        u+=[(copy(p),s+f'v{v}',f':,{v}')    #add p,↓v to queue
            for v in r_[:shape(p)[1]]]      # for all 0<=v<#columns
        u+=[(p,s+'>0',0)]                   #add p,→0
        p,s,i=u.pop(0)                      #get the first item of queue
        exec(f'p[{i}]=roll(p[{i}],1)')      #transform it
    return s                                #return the moves taken

>vвідповідають відповідно →↓. (інші не визначено)


0

Желе , 35 байт

ṙ€LXȮƊ¦1
ÇZÇZƊ⁾ULXȮOịØ.¤?F⁻Ṣ$$¿,“”Ṫ

Спробуйте в Інтернеті!

Повна програма. Вихідні дані переміщуються до STDOUT, використовуючи L для лівої та R для правої. Продовжує пробувати випадкові рухи, поки матриця не буде сортована, тому не дуже ефективна з точки зору швидкості чи алгоритмічної складності.

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