Series: Mô hình hóa các câu đố logic
Phần: 9 / 91. Giới thiệu
Haunted Mirror Maze (còn được gọi là Undead) là một câu đố logic được mô tả như sau, cho một lưới cỡ trong đó một số ô đã có sẵn một tấm gương chéo, người chơi cần điền vào mỗi ô còn lại một trong ba loại quái vật: ma cà rồng (), bóng ma (), hoặc thây ma (), thỏa mãn các điều kiện sau:
-
Các con số ngoài lưới cho biết số lượng quái vật nhìn thấy được khi nhìn vào lưới từ điểm đó. Một tia nhìn đi thẳng và bị bẻ góc mỗi khi đi qua một ô có gương, cho tới khi ra khỏi lưới.
-
Ma cà rồng chỉ nhìn thấy được khi nhìn trực diện, trước khi tia nhìn bị bẻ qua bất kỳ gương nào. Bóng ma thì ngược lại, chỉ nhìn thấy được sau khi tia nhìn đã bị bẻ qua ít nhất một gương. Thây ma thì luôn nhìn thấy được, dù nhìn trực diện hay qua phản chiếu.
-
Một số câu đố điền sẵn một vài ô với một loại quái vật cố định.
-
Một số câu đố còn cho biết tổng số ma cà rồng, bóng ma, và thây ma ẩn trong mê cung.
Nguồn: Bộ sưu tập câu đố của Simon Tatham
Để dễ hình dung hơn về logic của một tia nhìn, hãy xem xét ví dụ sau.
Nhìn từ bên trái, tia nhìn lần lượt đi qua một ma cà rồng (nhìn thấy, vì chưa bị bẻ qua gương nào), một bóng ma (không thể nhìn thấy, vì chưa qua phản chiếu), và một thây ma (luôn nhìn thấy được), rồi bị bẻ góc khi gặp gương. Từ đó trở đi, mọi thứ tia nhìn đi qua đều tính là phản chiếu: ma cà rồng giờ không thể nhìn thấy, còn bóng ma và thây ma đều nhìn thấy được. Tổng cộng có quái vật được nhìn thấy.
Dưới đây là ví dụ cho một câu đố Haunted Mirror Maze cỡ 6×6 và lời giải.
2. Mô hình hóa câu đố
Một số ký hiệu dùng trong bài toán
- là số hàng của lưới
- là số cột của lưới
- là tập hợp các ô đã có sẵn gương
- là tập hợp các tia nhìn. Với một tia nhìn , gọi là tập hợp các ô mà tia nhìn đi qua trước khi bị bẻ qua tấm gương đầu tiên, và là tập hợp các ô mà tia nhìn đi qua sau đó, khi đã bị bẻ qua ít nhất một gương. Cả hai tập hợp đều không bao gồm các ô chứa gương
- là số lượng quái vật nhìn thấy của tia nhìn
- , , lần lượt là tổng số ma cà rồng, bóng ma, và thây ma ẩn trong mê cung (nếu có)
- là tập hợp các cặp biểu diễn tọa độ của các ô đã điền sẵn trên lưới
- là loại quái vật được điền trong ô
2.1. Biến quyết định
Với mỗi ô trong lưới, xây dựng các biến , , thỏa mãn
2.2. Các ràng buộc
- Các ô chứa gương thì không chứa quái vật
- Mọi ô còn lại chứa đúng một quái vật
- Các ô đã điền sẵn
- Tổng số lượng mỗi loại quái vật (nếu có)
-
Số lượng quái vật nhìn thấy trên mỗi tia nhìn phải đúng bằng gợi ý.
Vì ma cà rồng chỉ nhìn thấy được khi nhìn trực diện, bóng ma chỉ nhìn thấy được khi đã qua phản chiếu, còn thây ma thì luôn nhìn thấy được, nên điều kiện này đơn giản là
2.3. Hàm mục tiêu
Bài toán này không có hàm mục tiêu, bởi vì ta không cần tối thiểu hóa hay tối đa hóa gì cả, việc cần làm chỉ là tìm ra một nghiệm chấp nhận được. Về mặt kỹ thuật, khi lập trình ta có thể để hàm mục tiêu là một hằng số (mình hay chọn số 0).
3. Kết luận
Đây là một câu đố có ý tưởng khá thú vị, tuy nhiên đây không phải là một câu đố khó. Các ràng buộc được biểu diễn khá trực diện và dễ hiểu.
Tham khảo thêm các câu đố Haunted Mirror Maze và biến thể tại Krazydad. Code mô hình hóa Haunted Mirror Maze bằng python có tại Tung-hehe.
Happy modeling!
