你有乙個帶有四個圓形撥輪的轉盤鎖。每個撥輪都有10個數字:'0', '1', '2', '3', '4', '5', '6', '7', '8', '9'
。每個撥輪可以自由旋**例如把'9'
變為'0'
,'0'
變為'9'
。每次旋轉都只能旋轉乙個撥輪的一位數字。
鎖的初始數字為'0000'
,乙個代表四個撥輪的數字的字串。
列表deadends
包含了一組死亡數字,一旦撥輪的數字和列表裡的任何乙個元素相同,這個鎖將會被永久鎖定,無法再被旋轉。
字串target
代表可以解鎖的數字,你需要給出最小的旋轉次數,如果無論如何不能解鎖,返回 -1。
示例 1:
輸入:deadends = ["0201","0101","0102","1212","2002"], target = "0202"
輸出:6
解釋:可能的移動序列為 "0000" -> "1000" -> "1100" -> "1200" -> "1201" -> "1202" -> "0202"。
注意 "0000" -> "0001" -> "0002" -> "0102" -> "0202" 這樣的序列是不能解鎖的,
因為當撥動到 "0102" 時這個鎖就會被鎖定。
示例 2:
輸入: deadends = ["8888"], target = "0009"
輸出:1
解釋:把最後一位反向旋轉一次即可 "0000" -> "0009"。
示例 3:
輸入: deadends = ["8887","8889","8878","8898","8788","8988","7888","9888"], target = "8888"
輸出:-1
解釋:無法旋轉到目標數字且不被鎖定。
示例 4:
輸入: deadends = ["0000"], target = "8888"
輸出:-1
死亡列表deadends
的長度範圍為[1, 500]
。
目標數字target
不會在deadends
之中。
每個deadends
和target
中的字串的數字會在 10,000 個可能的情況'0000'
到'9999'
中產生。
解題思路:剛開始單向搜尋的思路,即從「0000」出發,遍歷它的鄰近的組合,不是目標的,加入到已經訪問過的佇列到中,並加入到佇列中,等待下一次迴圈開始,後領扣時間超時。改用雙向搜尋,從目標和「0000」兩邊一起出發,哪邊的當前層集合的待檢測密碼鎖數目少,就檢測哪一邊。當其中有乙個集合為0表示斷路,不可能接通。當其中乙個集合中的鄰居包含在另外乙個集合當中則表示連線成功。
/* 單向搜尋,效率 低下public int openlock(string deadends, string target)
//查詢這個鎖是不是已經使用過了
if(findused(visits,neibor))
//查詢這個鎖是不是死亡鎖
if(!findused(arrays.aslist(deadends),neibor)) }}
count++;
} return -1;
}*//* * 雙向搜尋,效率快
*/public int openlock(string deadends, string target)
if (target.equals(init))
setset1 = new hashset<>();
set1.add(init);
setset2 = new hashset<>();
set2.add(target);
int count=0;
while (!set1.isempty() && !set2.isempty())
setset3 = new hashset<>();
for (string curlock : set1)
if (!dead.contains(nextlock) && !visited.contains(nextlock)) }}
count++;
set1 = set3;
} return -1;
} private boolean findused(listvisits, string neibor)
} return false;
} //遍歷當前鎖的所有鄰近鎖
public static listfindneibors(string currlock) {
int size=currlock.length();
listresult=new arraylist();
for(int i=0;i感謝下面兩個鏈結的大神。
單向搜尋參考:
雙向搜尋參考:
學習記錄2
pv操作同步過程 對訊號燈狀態進行改變,p呼叫一次 1,v呼叫一次 1。p操作 p s 是乙個原語操作,p操作執行 s 若s為負數,呼叫p s 的程序被阻塞,放到等待佇列q中。p s v操作 v s 剛好與p s 操作相反,v操作執行 s 若s為大於0,繼續執行 s 0,從訊號燈等待佇列移出乙個程序...
學習記錄2
1 如果電腦螢幕顯示異常 安裝360顯示卡驅動 3 win10虛擬機器未聯網,橋接模式沒有作用,勾選nta模式,用於共享主機的ip位址並重新啟動電腦 4 安裝cad如果安裝不成功,安裝路徑資料夾名稱可以修改為英文 5 虛擬機器安裝win10非常卡,將虛擬機器執行記憶體調大,由1gb調整為4gb 6 ...
學習記錄2
建立 django 子應用 新生成的檔案有 migrations 目錄用於存放資料庫遷移歷史檔案 models.py 使用者儲存資料庫模型類 tests.py 用於開發測試用例,編寫單元測試 views.py 用於編寫web應用檢視 1 直接新增 book 分界線 什麼是 orm 有點像 json ...