752. 打开转盘锁
Posted 不吐西瓜籽
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了752. 打开转盘锁相关的知识,希望对你有一定的参考价值。
算法记录
LeetCode 题目:
你有一个带有四个圆形拨轮的转盘锁。每个拨轮都有10个数字: ‘0’, ‘1’, ‘2’, ‘3’, ‘4’, ‘5’, ‘6’, ‘7’, ‘8’, ‘9’ 。每个拨轮可以自由旋转:例如把 ‘9’ 变为 ‘0’,‘0’ 变为 ‘9’ 。每次旋转都只能旋转一个拨轮的一位数字。
说明
一、题目
锁的初始数字为 ‘0000’ ,一个代表四个拨轮的数字的字符串。
列表 deadends 包含了一组死亡数字,一旦拨轮的数字和列表里的任何一个元素相同,这个锁将会被永久锁定,无法再被旋转。
字符串 target 代表可以解锁的数字,你需要给出解锁需要的最小旋转次数,如果无论如何不能解锁,返回 -1 。
二、分析
- 隐式的迷宫求解问题, 按照状态来区分有八种, 四个位数上的两种变化.
- 注意剪枝的情况判定.
class Solution {
class State{
String value;
int distance;
public State(String value, int distance) {
this.value = value;
this.distance = distance;
}
}
public int openLock(String[] deadends, String target) {
Queue<State> queue = new ArrayDeque();
Set<String> visit = new HashSet();
for(String s : deadends) visit.add(s);
if(visit.contains("0000")) return -1;
queue.add(new State("0000", 0));
visit.add("0000");
while(!queue.isEmpty()) {
State state = queue.poll();
if(target.equals(state.value)) return state.distance;
for(int i = 0; i < 4; i++) {
for(int j = -1; j < 2; j+=2) {
String ret = changeStatus(state.value, i, j);
if(visit.contains(ret)) continue;
visit.add(ret);
queue.add(new State(ret, state.distance + 1));
}
}
}
return -1;
}
private String changeStatus(String original, int index, int flag) {
StringBuilder builer = new StringBuilder(original);
char temp = builer.charAt(index);
temp = (char)(temp + flag);
if(temp > '9') temp = '0';
if(temp < '0') temp = '9';
builer.setCharAt(index, temp);
return builer.toString();
}
}
总结
熟悉广搜算法实现。
以上是关于752. 打开转盘锁的主要内容,如果未能解决你的问题,请参考以下文章
记一次队列和广度优先搜索问题(Leetcode.752 打开转盘锁)