#LAISIR66. 開鎖密碼(Open the Lock)
開鎖密碼(Open the Lock)
🏆 題目名稱:開鎖密碼(Open the Lock)
📘 題目背景
小明發現了一個四位數字密碼鎖,初始狀態為 "0000"。
每次操作,小明可以選擇任意一個位置,使該位數字向上或向下轉動一格:
0 → 1 → 2 → ... → 9 → 09 → 8 → ... → 0 → 9
但鎖中存在一些「禁止狀態」,一旦轉到該組密碼,鎖就會自動鎖死,無法再進行任何操作。
現在給定禁止狀態列表,與想要轉到的目標密碼 T,
請你求出小明從 "0000" 轉到 T 所需要的 最少操作次數。
若無法到達,輸出 -1。
🔢 操作定義
一次操作為:
- 選擇位置
i(0~3) - 將該位加 1(9 之後變 0) 或
- 將該位減 1(0 之前變 9)
例如 "0000" 可以一步變成以下八種狀態:
1000 9000
0100 0900
0010 0090
0001 0009
📥 輸入格式
d
(以下 d 行,每行一個四位整數字串:禁止狀態)
T
d:禁止狀態的數量- 每一行是一個
"0000" ~ "9999"的四位數字串 T:目標密碼(四位字串)
📤 輸出格式
一個整數,表示從 "0000" 轉到 T 所需的最少操作步數。
若無法到達,輸出 -1。
📘 數據規模與約定
為所有測試點:
0 ≤ d ≤ 10000- 禁止狀態兩兩不同
"0000"不會出現在禁止狀態列表中- 目標
T可能是禁止狀態,此時答案必為-1
🧪 樣例輸入 #1
3
0201
0101
0102
0202
🧪 樣例輸出 #1
6
📝 樣例解釋
從 0000 → 0202 的最短操作序列之一:
0000
0001
0002
0102 (禁止,不能走)
↑因此改路線
0000
1000
1100
1200
1201
1202
0202
共有 6 步。
Related
In following contests: