Tại bạn bè của chúng tôi tại Puzzling.SE , câu đố sau đây đã được đăng: Câu đố màu sắc này luôn có thể giải được? bởi Edgar G. Bạn có thể chơi nó ở đây .
Giải thích câu đố
Cho một m x n
lưới có các ô gồm ba màu khác nhau, bạn có thể chọn bất kỳ hai ô liền kề nào , nếu màu của chúng khác nhau . Hai gạch này sau đó được chuyển đổi sang màu thứ ba, nghĩa là một màu không được đại diện bởi hai gạch này. Câu đố được giải nếu tất cả các ô có cùng màu . Rõ ràng, người ta có thể chứng minh rằng câu đố này luôn luôn có thể giải được, nếu không m
cũng không n
chia hết cho 3.
Tất nhiên, điều này cầu xin một thuật toán giải. Bạn sẽ viết một hàm hoặc chương trình giải câu đố này. Lưu ý rằng các chức năng có 'tác dụng phụ' (nghĩa là đầu ra được bật stdout
chứ không phải trong một số giá trị trả về kiểu dữ liệu khó xử) được cho phép rõ ràng.
Đầu ra đầu vào
Các đầu vào sẽ là một m x n
ma trận bao gồm các số nguyên 1
, 2
và 3
(hoặc 0
, 1
, 2
nếu thuận tiện). Bạn có thể lấy đầu vào này ở bất kỳ định dạng lành mạnh. Cả hai m
và n
là >1
và không chia hết cho 3. Bạn có thể giả định các câu đố không được giải quyết
Sau đó bạn sẽ giải câu đố. Điều này sẽ liên quan đến việc lựa chọn lặp lại hai gạch liền kề để được 'chuyển đổi' (xem bên trên). Bạn sẽ xuất hai tọa độ của các ô này cho mỗi bước mà thuật toán giải của bạn đã thực hiện. Điều này cũng có thể ở bất kỳ định dạng đầu ra lành mạnh. Bạn có thể tự do lựa chọn giữa lập chỉ mục dựa trên 0 và 1 dựa trên tọa độ của mình và liệu các hàng hoặc cột được lập chỉ mục trước. Hãy đề cập đến điều này trong câu trả lời của bạn, tuy nhiên.
Thuật toán của bạn sẽ chạy trong thời gian hợp lý trên trường hợp 8x8 ban đầu. Brute-buộc nó hoàn toàn là không được phép một cách rõ ràng, tức là thuật toán của bạn nên chạy theo O(k^[m*(n-1)+(m-1)*n])
với k
số lượng các bước cần thiết cho việc giải quyết. Tuy nhiên, giải pháp không bắt buộc phải tối ưu. Bằng chứng được đưa ra trong câu hỏi được liên kết có thể cho bạn ý tưởng về cách thực hiện việc này (ví dụ: trước tiên, thực hiện tất cả các cột chỉ sử dụng các ô liền kề theo chiều dọc, sau đó thực hiện tất cả các hàng)
Các trường hợp thử nghiệm
Trong các trường hợp thử nghiệm này, tọa độ dựa trên 1 và các hàng được lập chỉ mục đầu tiên (như MATLAB / Octave và có thể nhiều thứ khác).
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]
Nếu muốn, tôi có thể đăng một pastebin của các trường hợp thử nghiệm lớn hơn, nhưng tôi nghĩ rằng điều này là đủ.