トピック出典:滞在ボタン(LeetCode)
リンク:https://leetcode-cn.com/problems/open-the-lock
あなたは、4つの円形ダイヤルロックとターンテーブルを持っていますか。'0'、 '1'、 '2'、 '3'、 '4'、 '5'、 '6'、 '7'、 '8'、 '9':各ダイヤル10桁を有します。各ダイヤルは、自由に回転することができる:例えば、「9」から「0」、「0」から「9」。各回転は、桁のダイヤルを回転させるだけですることができます。
ロックの初期数は、ダイヤル文字列の数が4を表し、「0000」です。
Deadendsリストは、死亡のセット数、同じ番号が含まれており、リストのクリックホイール内の任意の要素と、ロックは永久にロックされません、もはや回転させることができます。
文字列ターゲット代表はデジタルロックを解除することができますどのような場合は、返品のロックを解除できない場合、あなたは、回転数の最小値を与える必要が-1。
ソリューション:
BFS(幅優先アルゴリズム)一般解:通常の状況下では、その隣人はまだノードがチェックされていない容器の中に配置されますが(例えば、キューまたはリストのために)オープンと呼ばれ、検証されますノードは閉じで言及容器に入れました。
タイトルのアイデア:、ルートから始まるロックに隣接する現在のロックのために見て、その後、コレクションを開くためにそれを追加して、コレクションに追加訪問の終了後に毎回ロック。
public static int openLock(String[] deadends,String target){
Set<String> dead = new HashSet<>(Arrays.asList(deadends));
Set<String> visited = new HashSet<>();
String init = "0000";
if (dead.contains(init) || dead.contains(target)) {
return -1;
}
if (target.equals(init)) {
return 0;
}
Set<String> set1 = new HashSet<>();
set1.add(init);
Set<String> set2 = new HashSet<>();
set2.add(target);
int count=0;
while (!set1.isEmpty() && !set2.isEmpty()) {
//将最小的集合遍历
if (set1.size() > set2.size()) {
Set<String> temp = set1;
set1 = set2;
set2 = temp;
}
Set<String> set3 = new HashSet<>();
for (String curLock : set1) {
List<String> neibors=findNeibors(curLock);
for (String nextLock : neibors) {
//如果set2中包含了这个Lock,则表示初试和目标在途中相遇到了
if(set2.contains(nextLock)) {
return count+1;
}
if (!dead.contains(nextLock) && !visited.contains(nextLock)) {
visited.add(nextLock);
set3.add(nextLock);
}
}
}
count++;
set1 = set3;
}
return -1;
}
/**
* 找当前锁相邻的锁
*/
public static List<String> findNeibors(String currLock){
int size = currLock.length();
List<String> result = new ArrayList<String>();
//对锁的4位数分别处理
for(int i=0;i<size;i++){
String temp = currLock;
char[] cs = temp.toCharArray();
if(cs[i]=='9'){
cs[i]= '0';
}else{
cs[i] = (char)(cs[i] +1);
}
temp = new String(cs);
result.add(temp);
//执行-1操作
temp = currLock;
cs = temp.toCharArray();
if(cs[i] =='0'){
cs[i] = '9';
}else{
cs[i]=(char)(cs[i]-1);
}
temp = new String(cs);
result.add(temp);
}
return result;
}
一步一个脚印,记录自己的成长