Mẫu vấn đề như một đồ thị:
- Nodes là những con số
- nút gốc của bạn là 1
- Liên kết giữa các nút là
*5
hoặc +3
.
Sau đó, chạy Dijkstra's algorithm để nhận đường đi ngắn nhất. Nếu bạn xả tất cả các liên kết khỏi các nút <N
mà không cần đến N
thì bạn không thể tạo ra N
. (Ngoài ra, hãy sử dụng câu trả lời của @ obourgain để quyết định xem liệu vấn đề có thể được giải quyết hay không và chỉ cố gắng giải quyết vấn đề nếu nó có thể được giải quyết.)
Vì vậy, về cơ bản, bạn đưa vào nút (1, đường dẫn null). Bạn cần một từ điển lưu trữ {node (tức là số) => đường dẫn tốt nhất được tìm thấy cho đến nay cho nút đó}. Sau đó, miễn là hàng đợi không trống, trong mỗi đường vòng của vòng lặp, bạn
- Làm dịu đầu (nút, đường dẫn) khỏi hàng đợi.
- Nếu số lượng nút này là
>N
hoặc bạn đã thấy nút này trước đây với ít bước hơn trong đường dẫn, thì bạn không cần thực hiện thêm bất kỳ thao tác nào nữa trên thẻ này.
- Thêm (node => path) vào từ điển.
- Enqueue các nút truy cập từ nút này với
*5
và +3
(cùng với đường dẫn giúp bạn có được những nút)
Khi vòng lặp kết thúc, nhìn lên N
trong từ điển để có được những con đường, hoặc đầu ra " Không thể tạo ra nó ".
Sửa: lưu ý, đây thực sự là Breadth-first search hơn là thuật toán Dijkstra, như chi phí đi qua một liên kết được cố định ở mức 1.
Điều này thật tuyệt vời. +1 –
+1 (mặc dù bạn quên kiểm tra trường hợp đặc biệt N == 2) – Henrik
@Henrick: sửa lỗi – obourgain