pengantar
Anda adalah seorang ahli biologi yang mempelajari pola pergerakan bakteri. Tim peneliti Anda memiliki banyak dari mereka dalam cawan petri, dan Anda merekam aktivitas mereka. Sayangnya, Anda benar-benar kekurangan dana, dan tidak mampu membeli kamera video, jadi Anda hanya mengambil gambar hidangan secara berkala. Tugas Anda adalah membuat program yang melacak pergerakan kuman dari gambar-gambar ini.
Memasukkan
Input Anda adalah dua larik 2D karakter dalam format apa pun yang wajar, mewakili gambar cawan petri berturut-turut. Di kedua array, karakter .
mewakili ruang kosong, dan O
mewakili kuman (Anda dapat memilih dua karakter berbeda jika Anda mau). Juga, susunan "setelah" diperoleh dari susunan "sebelum" dengan menggerakkan beberapa kuman satu langkah di salah satu dari empat arah mata angin; khususnya, susunan memiliki bentuk yang sama. Kuman bergerak secara bersamaan, jadi salah satu dari mereka mungkin pindah ke ruang yang sudah mengandung kuman lain, jika bergerak keluar dari jalan. Dijamin bahwa batas array "sebelum" hanya berisi ruang kosong, dan setidaknya ada satu kuman. Dengan demikian, berikut adalah pasangan input yang valid:
Before After
...... ......
.O..O. ....O.
.OO.O. .OO.O.
...... ..O...
Keluaran
Output Anda adalah array 2D karakter tunggal dalam format yang sama dengan input. Ini diperoleh dari susunan "sebelum" dengan mengganti kuman-kuman yang telah pindah dengan salah satunya >^<v
, tergantung pada arah gerakannya (Anda juga dapat menggunakan 4 karakter berbeda di sini). Mungkin ada beberapa kemungkinan keluaran, tetapi Anda hanya akan memberikan salah satunya. Dalam contoh di atas, satu kemungkinan hasil yang benar adalah
......
.v..O.
.>v.O.
......
Pergerakan yang tidak perlu diizinkan dalam output dan kuman dapat bertukar tempat, jadi yang berikut ini juga valid:
......
.v..v.
.>v.^.
......
Aturan dan penilaian
Anda dapat menulis program atau fungsi lengkap. Hitungan byte terendah menang, dan celah standar tidak diizinkan.
Saya tertarik pada algoritma yang relatif efisien, tetapi saya tidak ingin melarang brute force sepenuhnya. Untuk alasan ini, ada bonus -75% untuk menyelesaikan test case terakhir dalam 10 menit pada CPU modern (saya tidak dapat menguji sebagian besar solusi, jadi saya hanya akan mempercayai Anda di sini). Penafian: Saya tahu bahwa ada algoritma cepat (mencari "masalah jalur terpisah"), tetapi saya belum mengimplementasikannya sendiri.
Kasus uji tambahan
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
sesuai dengan gerakan tepat satu langkah ke arah masing-masing.