classSolution(object): defopenLock(self, deadends, target): defneighbors(node): for i in xrange(4): x = int(node[i]) for d in (-1, 1): y = (x + d) % 10 yield node[:i] + str(y) + node[i+1:]
dead = set(deadends) queue = collections.deque([('0000', 0)]) seen = {'0000'} while queue: node, depth = queue.popleft() if node == target: return depth if node in dead: continue for nei in neighbors(node): if nei notin seen: seen.add(nei) queue.append((nei, depth+1)) return -1
left = set() left.add('0000') right = set() right.add(target) step = 0
while (left and right): temp = set() iflen(left) > len(right): left, right = right, left for node in left: for i inrange(4): x = int(node[i]) for j in (-1,1): y = (x + j) % 10 cur = node[:i]+str(y)+node[i+1:] # 如果当前节点的下一个节点,在另一边的节点中了,那么说明再往下走一层,就可以连通,也就是可以解锁了. if cur in right: return step+1 # 将节点加入下一层要加入的节点中,将deadends作为的visited数组. if cur notin dead: temp.add(cur) dead.add(cur) step += 1 left = temp