Вступ
Ви біолог, що вивчає закономірності руху бактерій. У вашій дослідницькій групі є купа їх у чашках Петрі, і ви записуєте їхню діяльність. На жаль, у вас серйозно недостатньо фінансуються, і ви не можете дозволити собі відеокамеру, тому ви просто фотографуєте страву через рівні проміжки часу. Ваше завдання - скласти програму, яка відстежує рухи мікробів з цих картинок.
Вхідні дані
Ваші входи - це два двовимірні масиви символів у будь-якому розумному форматі, що представляють послідовні зображення чашки Петрі. В обох масивах символ .
представляє порожній простір і O
являє собою зародок (за бажанням можна вибрати будь-які два різних символи). Також масив "після" отримується з масиву "до" шляхом переміщення деяких мікробів на один крок в одному з чотирьох кардинальних напрямків; зокрема, масиви мають однакову форму. Зародки рухаються одночасно, тому один з них може переміститися в простір, в якому вже містився інший зародок, якщо він рухається з шляху. Гарантується, що межі масиву "до" містять лише порожні пробіли, а також є щонайменше один зародок. Таким чином, наступна пара є вхідними парами:
Before After
...... ......
.O..O. ....O.
.OO.O. .OO.O.
...... ..O...
Вихідні дані
Ваш вихід - це один двовимірний масив символів у тому ж форматі, що і входи. Він отримується з масиву "до" шляхом заміни тих мікробів, які перемістилися одним із >^<v
, залежно від напрямку руху (тут також можна використовувати будь-які 4 різних символи). Можливо декілька можливих результатів, але ви повинні дати лише один з них. У наведеному вище прикладі можливий правильний вихід
......
.v..O.
.>v.O.
......
Допускається непотрібний рух у виході, і мікроби можуть міняти місцями, тому дійсне також:
......
.v..v.
.>v.^.
......
Правила та оцінка
Ви можете написати повну програму або функцію. Виграє найменший кількість байтів, а стандартні лазівки заборонені.
Мене цікавлять порівняно ефективні алгоритми, але я не хочу повністю забороняти грубі форсування. З цієї причини на сучасному процесорі є бонус -75% за вирішення останнього тестового випадку (я не в змозі протестувати більшість рішень, тому я вам тут просто довіряю). Відмова: Я знаю, що існує швидкий алгоритм (пошук "проблеми нерозбірних шляхів"), але я сам його не реалізував.
Додаткові тестові випадки
Before
......
.O..O.
..OO..
......
After
......
..O...
...OO.
..O...
Possible output
......
.>..v.
..vO..
......
Before
.......
.OOOOO.
.O..OO.
.OO..O.
.OOOOO.
.......
After
.......
..OOOOO
.O...O.
.O...O.
.OOOOOO
....O..
Possible output
.......
.>>>>>.
.O..>v.
.Ov..v.
.O>>v>.
.......
Before
..........
.OOO..OOO.
.OOOOOOOO.
.OOO..OOO.
..........
After
..O.......
.OOO..O.O.
..OOOOOOOO
.O.O..OOO.
.......O..
Possible output
..........
.>^O..O>v.
.^O>>>vO>.
.O>^..>vO.
..........
Before
............
.OO..OOOOOO.
.OO......OO.
...OOOOOO...
.O.OOOOOO.O.
...OOOOOO...
.OOOOOOOOOO.
............
After
..........O.
.OO..OOOOO..
.O...O...O..
.O.OOOOOOO..
.O.OOOOOO..O
...OO..OO...
....OOOOOOOO
.OOO........
Possible output
............
.OO..v<<<<^.
.v<......^<.
...OOO>>>...
.O.OOO^OO.>.
...OOv^OO...
.vvvO>>>>>>.
............
Before
................
.OOOOOO.OOOOOOO.
..OO..OOOOOOOOO.
.OOO..OOOO..OOO.
..OOOOOOOO..OOO.
.OOOOOOOOOOOOOO.
................
After
................
..OOOOO.OOOOOOOO
..OO..OOOOOOOOO.
..OO..OOOO..OOOO
..OOOOOOOO..OOO.
..OOOOOOOOOOOOOO
................
Possible output
................
.>>>>>v.>>>>>>>.
..OO..>>^>>>>>v.
.>>v..OOO^..OO>.
..O>>>>>>^..OOO.
.>>>>>>>>>>>>>>.
................
Before
..............................
.OOO.O.O.....O.....O.O.O..O...
..OOO.O...O..OO..O..O.O.......
.....O......O..O.....O....O...
.O.OOOOO......O...O..O....O...
.OO..O..OO.O..OO..O..O....O...
..O.O.O......OO.OO..O..OO.....
..O....O..O.OO...OOO.OOO...O..
.....O..OO......O..O...OO.OO..
........O..O........OO.O.O....
..O.....OO.....OO.OO.......O..
.O.....O.O..OO.OO....O......O.
..O..OOOO..O....OO..........O.
.O..O...O.O....O..O....O...OO.
....O...OO..O.......O.O..OO...
........O.O....O.O....O.......
.OO.......O.OO..O.......O..O..
....O....O.O.O...OOO..O.O.OO..
.OO..OO...O.O.O.O.O...OO...O..
..............................
After
..............................
.OOOOO.......OO.....O..O......
...OO..O...O...O....OO....O...
....O.O......O..OO...OO...O...
.OO.OOOO......OO..O..O........
O.O.OO..O..O..O..OO...O...OO..
.OO.....O....OO.O..O.OO.O.....
......O.....O.....OOO.OO...O..
....O..OOOO..O..O..O.O.O.OO...
..O......O.O........O...O.O...
.O.....OOO.....OO.OO...O...O..
.......OOO..O.O.O...........O.
.O...O.....O...OOOO..O.O....O.
.O..O.O..O.....O......O....OO.
....O..O..O.O......O.....O....
........OOO....O......O..O....
.OO......O..OO..OOO.....O..O..
..O.O....OO..O...OO...O...OO..
.O..OO....O..O...O.O.O.OO.....
..............O............O..
Possible output
..............................
.OOO.O.v.....>.....>.v.O..v...
..>>^.v...>..^>..v..O.v.......
.....<......>..>.....O....O...
.O.<O><O......O...O..O....v...
.<O..O..v<.O..O^..O..>....>...
..<.^.v......OO.O^..>..<O.....
..^....v..v.Ov...>>^.<OO...O..
.....<..OO......O..O...Ov.v<..
........>..O........O^.v.^....
..^.....Ov.....OO.OO.......O..
.^.....^.^..O>.vO....v......O.
..<..Ov^^..O....><..........O.
.O..O...>.v....O..^....^...OO.
....O...<v..O.......<.^..v<...
........O.O....O.v....O.......
.OO.......<.Ov..O.......O..O..
....O....O.<.^...O^v..O.v.OO..
.O^..<<...O.>.v.>.^...<O...v..
..............................
>^<v
відповідає руху рівно одного кроку у відповідному напрямку.