1.BFS模板
int BFS(Node start, Node target) {
Queue<Node> q;
Set<Node> visited;
q.offer(start);
visited.add(start);
int step = 0;
while (q not empty) {
int sz = q.size();
for (int i = 0; i < sz; i++) {
Node cur = q.poll();
if (cur is target)
return step;
for (Node x : cur.adj())
if (x not in visited) {
q.offer(x);
visited.add(x);
}
}
step++;
}
}
1.leetcode752题
int openLock(String[] deadends, String target) {
// 记录需要跳过的死亡密码
Set<String> deads = new HashSet<>()
for (String s : deadends) deads.add(s)
// 记录已经穷举过的密码,防止走回头路
Set<String> visited = new HashSet<>()
Queue<String> q = new LinkedList<>()
// 从起点开始启动广度优先搜索
int step = 0
q.offer("0000")
visited.add("0000")
while (!q.isEmpty()) {
int sz = q.size()
/* 将当前队列中的所有节点向周围扩散 */
for (int i = 0
String cur = q.poll()
/* 判断是否到达终点 */
if (deads.contains(cur))
continue
if (cur.equals(target))
return step
/* 将一个节点的未遍历相邻节点加入队列 */
for (int j = 0
String up = plusOne(cur, j)
if (!visited.contains(up)) {
q.offer(up)
visited.add(up)
}
String down = minusOne(cur, j)
if (!visited.contains(down)) {
q.offer(down)
visited.add(down)
}
}
}
/* 在这里增加步数 */
step++
}
// 如果穷举完都没找到目标密码,那就是找不到了
return -1
}