1.打开转盘锁
原题
思路: 状态位一共有4位,前后都可进一步,所以从一个状态到下一个状态有8种可能。在这个基础上,采用广度优先的思想来解题。需要的数据结构是队列,并且还需要一个哈希集合来判断状态是否已经尝试。并且用nll放入队列来隔开每一层的遍历。
所以:
- 当取出队列中的第一个节点,先判断是否位null,如果是,则说明进入下一层,即步数加一,并且判断队列中第一个元素是否是null,如果不是的话,在队列末尾加null。
- 再判断节点是否是目标节点
- 最后判断是否是死亡节点,如果不是的话,对这个节点进行广度优先搜索。将它的八种状态都加入队列,在加之前,判断一下是否已经遍历过。
上代码:
class Solution {
public int openLock(String[] deadends, String target) {
Set<String> dead=new HashSet<>();
Set<String> seen=new HashSet<>();
for(String s:deadends)
dead.add(s);
Queue<String> list=new LinkedList<>();
list.offer("0000");
list.offer(null);
//seen.add("0000");
int depth=0;
while(!list.isEmpty()){
String node=list.poll();
seen.add(node);
if(node==null){
depth++;
if(list.peek()!=null){
list.offer(null);
}
}else if(node.equals(target)){
return depth;
}
else if(!dead.contains(node)){
for(int i=0;i<4;i++){
for(int j=-1;j<=1;j+=2){
int temp=(node.charAt(i)-'0'+j+10)%10;
String newnode=node.substring(0,i)+(""+temp)+node.substring(i+1);
if(!seen.contains(newnode)){
seen.add(newnode);
list.offer(newnode);
}
}
}
}
}
return -1;
}
}