Mô tả bài toán
Tìm tất cả các số có N chữ số sao cho chênh lệch tuyệt đối giữa hai chữ số liên tiếp luôn bằng K. Số không được có số 0 dẫn đầu (trừ số 0 chính nó).
Ví dụ
Nếu N = 4, K = 7, đầu ra là [1818, 2929, 7070, 8181, 9292]. Số 0707 không hợp lệ vì có số 0 dẫn đầu.
Giải thuật (BFS)
- Nếu
N == 1, trả về[0..9]. - Khởi tạo hàng đợi
queuevới các số từ 1 đến 9. - Lặp
N-1lần:- Với mỗi số trong hàng đợi hiện tại, lấy chữ số cuối
lsd. - Nếu
lsd - K >= 0, thêmnum*10 + lsd - Kvào hàng đợi. - Nếu
K != 0vàlsd + K <= 9, thêmnum*10 + lsd + Kvào hàng đợi.
- Với mỗi số trong hàng đợi hiện tại, lấy chữ số cuối
- Trả về các phần tử trong hàng đợi.
Triển khai Python
from collections import deque
def solve(N, K):
if N == 1:
return list(range(10))
queue = deque(list(range(1, 10)))
for n in range(N - 1):
len_queue = len(queue)
for j in range(len_queue):
num = queue.popleft()
lsd = num % 10
if lsd - K >= 0:
queue.append(num * 10 + lsd - K)
if K and lsd + K <= 9:
queue.append(num * 10 + lsd + K)
return list(queue)
N = 4
K = 7
print(solve(N, K))
Đầu vào
4, 7
Đầu ra
[1818, 2929, 7070, 8181, 9292]