Di arah teman-teman kami di Puzzling.SE , teka-teki berikut diposting: Apakah teka-teki berwarna ini selalu dapat dipecahkan? oleh Edgar G. Anda dapat memainkannya di sini .
Penjelasan teka-teki
Diberi m x n
kisi dengan ubin dengan tiga warna berbeda, Anda dapat memilih dua ubin yang berdekatan , jika warnanya berbeda . Kedua ubin ini kemudian dikonversi ke warna ketiga, yaitu, satu warna yang tidak diwakili oleh dua ubin ini. Teka-teki diselesaikan jika semua ubin memiliki warna yang sama . Rupanya, seseorang dapat membuktikan bahwa teka-teki ini selalu dapat dipecahkan, jika tidak ada m
atau tidak n
dapat dibagi oleh 3.
Tentu saja, ini memohon algoritma penyelesaian. Anda akan menulis fungsi atau program yang memecahkan teka-teki ini. Perhatikan bahwa fungsi dengan 'efek samping' (yaitu, output aktif stdout
daripada dalam beberapa nilai pengembalian tipe data canggung) diizinkan secara eksplisit.
Input output
Input akan menjadi m x n
matriks yang terdiri dari bilangan bulat 1
, 2
dan 3
(atau 0
, 1
, 2
jika nyaman). Anda dapat mengambil input ini dalam format waras apa pun. Kedua m
dan n
yang >1
dan tidak habis dibagi 3. Anda mungkin menganggap teka-teki yang tidak terpecahkan
Anda kemudian akan memecahkan teka-teki. Ini akan melibatkan pemilihan berulang dua ubin yang berdekatan untuk 'dikonversi' (lihat di atas). Anda akan menampilkan dua koordinat ubin ini untuk setiap langkah yang diambil algoritma penyelesaian Anda. Ini juga mungkin dalam format output yang waras. Anda bebas memilih antara pengindeksan berbasis 0 dan 1 berdasarkan koordinat Anda, dan apakah baris atau kolom diindeks terlebih dahulu. Tolong sebutkan ini dalam jawaban Anda.
Algoritme Anda harus berjalan dalam waktu yang wajar pada kasing 8x8 asli. Brute-forcing itu sepenuhnya dilarang secara eksplisit, yaitu algoritma Anda harus berjalan di bawah O(k^[m*(n-1)+(m-1)*n])
dengan k
sejumlah langkah yang diperlukan untuk solusi. Namun solusinya tidak harus optimal. Bukti yang diberikan dalam pertanyaan yang ditautkan dapat memberi Anda ide tentang bagaimana melakukan ini (misalnya, pertama-tama lakukan semua kolom hanya menggunakan petak yang berdekatan secara vertikal, lalu lakukan semua baris)
Uji kasus
Dalam kasus uji ini, koordinatnya berbasis 1 dan baris diindeks terlebih dahulu (seperti MATLAB / Oktaf dan mungkin banyak lainnya).
Input:
[1 2]
Output: (result: all 3's)
[1 1],[1,2]
Input:
[ 1 2
3 1 ]
Output: (result: all 1's)
[1 1],[2 1] (turn left column into 2's)
[2 1],[2 2] (turn right column into 3's)
[1 1],[1 2] (turn top row into 1's)
[2 1],[2 2] (turn bottom row into 1's)
Input:
[1 2 3 2
3 2 1 1]
Output: (result: all 3's)
[1 1],[1 2]
[1 3],[1 4]
[1 2],[1 3]
[1 1],[1 2]
[1 2],[1 3]
[1 1],[1 2]
[1 3],[1 4]
[2 1],[2 2]
[1 1],[2 1]
[1 2],[2 2]
[1 3],[2 3]
[1 4],[2 4]
Jika diinginkan, saya dapat memposting pastebin kasus uji yang lebih besar, tapi saya pikir ini sudah cukup.