Puzzling.SE'deki arkadaşlarımıza şu bildiri gönderildi: Bu renk bulmacası her zaman çözülebilir mi? Edgar G. Burada oynayabilirsin .
Bulmaca açıklaması
Bir Verilen m x n
üç farklı renk çinileri ile ızgara, sen seçebilirsiniz herhangi iki komşu fayans renkleri ise, farklı . Bu iki karo daha sonra üçüncü renge, yani bu iki karo tarafından temsil edilmeyen bir renge dönüştürülür. Tüm fayanslar aynı renge sahipse, bulmaca çözülür . Görünüşe göre, bir yapabilirsiniz kanıtlamak ne bu bulmaca, hep çözülebilir olduğunu m
ne de n
3 ile bölünebilir.
Tabii ki, bu bir çözme algoritması için yalvarır. Bu bulmacayı çözen bir işlev veya program yazacaksınız. 'Yan etkileri' olan fonksiyonlara (yani, stdout
bazı garip veri tipi dönüş değerlerinden ziyade çıktı açık) açık bir şekilde izin verildiğine dikkat edin.
Giriş çıkış
Giriş, bir olacaktır m x n
tamsayı oluşan matris 1
, 2
ve 3
(veya 0
, 1
, 2
uygun ise). Bu girişi herhangi bir aklı başında formatta alabilirsiniz. Her ikisi de m
ve 3 n
ile >1
bölünemezler. Bulmacanın çözülmediğini varsayabilirsiniz.
Daha sonra bulmacayı çözeceksiniz. Bu, 'dönüştürülecek' bitişik iki fayansın tekrar tekrar seçilmesini içerecektir (yukarıya bakınız). Çözme algoritmanızın attığı her adım için bu döşemelerin iki koordinatını çıkartacaksınız. Bu, herhangi bir mantıklı çıktı biçiminde de olabilir. Koordinatlarınızın 0 tabanlı ve 1 tabanlı dizini arasında seçim yapmakta ve önce satırların mı yoksa sütunların mı endekslendiğini seçmekte özgürsünüz. Lütfen cevabınızda bunu belirtiniz.
Algoritmanız, orijinal 8x8 vakasında makul bir sürede çalışmalıdır. Açıkça izin verilmese tamamen Brute-zorlayarak, sizin algoritması altında çalışmalıdır yani O(k^[m*(n-1)+(m-1)*n])
birlikte k
çözüm için gereken adımların sayısını. Ancak çözümün optimal olması gerekli değildir . Bağlantılı soruda verilen ispat size bunun nasıl yapılacağına dair bir fikir verebilir (örneğin, tüm sütunları yalnızca dikey olarak bitişik karolar kullanarak ve sonra tüm satırları yapın)
Test durumları
Bu test durumlarında, koordinatlar 1 tabanlıdır ve ilk önce sıralar dizine alınır (MATLAB / Octave ve muhtemelen diğerleri gibi).
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]
İstenirse, daha büyük test vakaları içeren bir pastebin yayınlayabilirim, ancak bunun yeterli olması gerektiğini düşünüyorum.