Hướng dẫn giải của Đường Đi Hamilton
Chỉ dùng lời giải này khi không có ý tưởng, và đừng copy-paste code từ lời giải này. Hãy tôn trọng người ra đề và người viết lời giải.
Nộp một lời giải chính thức trước khi tự giải là một hành động có thể bị ban.
Nộp một lời giải chính thức trước khi tự giải là một hành động có thể bị ban.
Lời giải: Gặm Cỏ
Hướng tiếp cận
Đếm số đường đi Hamilton trên lưới từ ô đến ô bằng thuật toán quay lui (backtracking/DFS). Lưới nhỏ nên brute-force hoàn toàn khả thi.
Nhận xét quan trọng
- Lưới chỉ có ô. Dù số đường đi lý thuyết lớn, việc cắt tỉa sớm (pruning) làm cho DFS chạy rất nhanh.
- Khi có ô bị chặn, tổng số ô cần thăm là (luôn bao gồm và , vì và chẵn).
- Cần đánh dấu ô đã thăm và bỏ qua ô bị chặn.
Thuật toán
- Đọc ô bị chặn, đánh dấu vào mảng
blocked[5][5]. - Đếm tổng số ô không bị chặn
target = 25 - K. - DFS từ với bộ đếm số ô đã thăm:
- Nếu đang ở và đã thăm đúng
targetô: tăng đáp án lên 1, quay lui. - Thử 4 hướng (lên/xuống/trái/phải): nếu ô hợp lệ, chưa thăm, không bị chặn thì đi vào, đệ quy tiếp, rồi bỏ đánh dấu.
- Nếu đang ở và đã thăm đúng
- In kết quả.
Độ phức tạp
- Thời gian: trong trường hợp xấu nhất, nhưng pruning cắt tỉa mạnh. Thực tế rất nhanh với lưới .
- Bộ nhớ: (chiều sâu đệ quy tối đa)
Bình luận