//對bfs的理解會更加通徹
class solution
//記錄已經走過的位置,防止走回頭路。
setvisited = new hashset<>();
//接下來就是bfs搜尋模板
queueq = new linkedlist<>();
int step = 0;
q.offer("0000");
visited.add("0000");
while(!q.isempty())
if(cur.equals(target))
for(int j = 0; j < 4; j++)
string down = minusone(cur, j);
if (!visited.contains(down)) }}
step++;
}return -1;
}//向上撥動一次
public string plusone(string s, int j)else
return new string(ch);
}//向下撥動一次
public string minusone(string s, int j) else
return new string(ch);
}}題解過程:deadends = ["0201","0101","0102","1212","2002"], target = "0103"
0000 -> 0100
-> 0001
visted的作用就是不會再從0100轉到0000了, 且0001也不會走到0000,因為這樣重複走了
0000 -> 0100 -> 0101
-> 0100 -> 0109
-> 0001 -> 0101
-> 0001 -> 0002
此時有死亡的數字判斷了
0000 -> 0100 -> 0101 (死亡數字跳過)
-> 0100 -> 0109
-> 0100 -> 0109 -> 0108
-> 0001 -> 0101 (死亡數字跳過)
-> 0001 -> 0002
-> 0001 -> 0002 -> 0102
-> 0001 -> 0002 -> 0902
......
以上是代表性的路徑
最直觀的就是 0000 -> 0100 -> 0109 -> 0108 -> 0107 -> 0106 -> 0105 -> 0104 -> 0103(0100 -> 0101路不通)
還有最簡路徑 0000 -> 0000 -> 0001 -> 0002 -> 0003 -> 0103
時間複雜度:o(n^2 * a^n + d)
空間複雜度:o(a^n + d)
其中a表示數字的個數,n表示狀態的位數,d表示陣列 deadends 的大小
752 開啟轉盤鎖
題目描述 你有乙個帶有四個圓形撥輪的轉盤鎖。每個撥輪都有10個數字 0 1 2 3 4 5 6 7 8 9 每個撥輪可以自由旋 例如把 9 變為 0 0 變為 9 每次旋轉都只能旋轉乙個撥輪的一位數字。鎖的初始數字為 0000 乙個代表四個撥輪的數字的字串。列表 deadends 包含了一組死亡數字...
752 開啟轉盤鎖
你有乙個帶有四個圓形撥輪的轉盤鎖。每個撥輪都有10個數字 0 1 2 3 4 5 6 7 8 9 每個撥輪可以自由旋 例如把 9 變為 0 0 變為 9 每次旋轉都只能旋轉乙個撥輪的一位數字。鎖的初始數字為 0000 乙個代表四個撥輪的數字的字串。列表 deadends 包含了一組死亡數字,一旦撥輪...
leetcode 752 開啟轉盤鎖
752.開啟轉盤鎖 你有乙個帶有四個圓形撥輪的轉盤鎖。每個撥輪都有10個數字 0 1 2 3 4 5 6 7 8 9 每個撥輪可以自由旋 例如把 9 變為 0 0 變為 9 每次旋轉都只能旋轉乙個撥輪的一位數字。鎖的初始數字為 0000 乙個代表四個撥輪的數字的字串。列表 deadends 包含了一...