#LAISIR66. 開鎖密碼(Open the Lock)

開鎖密碼(Open the Lock)

🏆 題目名稱:開鎖密碼(Open the Lock)

📘 題目背景

小明發現了一個四位數字密碼鎖,初始狀態為 "0000"。 每次操作,小明可以選擇任意一個位置,使該位數字向上或向下轉動一格:

  • 0 → 1 → 2 → ... → 9 → 0
  • 9 → 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 步。