Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python BFS解决openLock问题_Python - Fatal编程技术网

Python BFS解决openLock问题

Python BFS解决openLock问题,python,Python,Leetcode引入了两个,第二个: #返回根节点和目标节点之间最短路径的长度。 #伪码 def bfs(根、目标) #声明数据 queue=deque()#存储等待处理的所有节点 visited=set()#存储我们访问过的所有节点 #步骤以监视执行情况 阶跃=0;#从根节点到当前节点需要执行的步骤数 #初始化 将根添加到队列 将根添加到已访问的; #BFS while(队列不为空){ 步骤=步骤+1; #迭代已在队列中的节点 大小=len(队列); 对于(int i=0;i

Leetcode引入了两个,第二个:

#返回根节点和目标节点之间最短路径的长度。
#伪码
def bfs(根、目标)
#声明数据
queue=deque()#存储等待处理的所有节点
visited=set()#存储我们访问过的所有节点
#步骤以监视执行情况
阶跃=0;#从根节点到当前节点需要执行的步骤数
#初始化
将根添加到队列
将根添加到已访问的;
#BFS
while(队列不为空){
步骤=步骤+1;
#迭代已在队列中的节点
大小=len(队列);
对于(int i=0;i
模板很清晰,因为它一次只做一件事,
1) 在
节点cur=队列中的第一个节点中执行
终止检查

2) 在以下迭代中拉伸以查找邻居。
相反,许多实现检查
如果next==target,则返回当前级别的步骤+1
,这将终止检查和拉伸作业混合在一起

使用模板解决
openLock
问题

你面前有一把带有4个圆形轮子的锁。每个轮子有10个槽:
'0',1',2',3',4',5',6',7',8',9'
。轮子可以自由旋转和缠绕:例如,我们可以将
'9'
转动成
'0'
,或将
'0'
转动成
'9'
。每个动作包括将一个轮子转动一个槽t

锁最初从
'0000'
开始,该字符串表示4个车轮的状态

您将看到一个
死角列表
死角,这意味着如果锁显示这些代码中的任何一个,锁的轮子将停止转动,您将无法打开它

给定表示将解锁锁的车轮值的
目标
,返回打开锁所需的最小总转数,如果不可能,返回-1

示例1:

Input:deadends=[“0201”、“0101”、“0102”、“1212”、“2002”],target=“0202”
产出:6
说明:
有效移动的顺序为“0000”->“1000”->“1100”->“1200”->“1201”->“1202”->“0202”。
请注意,像“0000”->“0001”->“0002”->“0102”->“0202”这样的序列将无效,
因为在显示屏变成死胡同“0102”后,锁的轮子卡住了。
我的解决方案

类解决方案5:
def打开锁定(自身、死区、目标):
从集合导入deque
#申报
queue=deque()
访问=设置()
根='0000'
#发起
步长=0
死区=设置(死区)
queue.append(根)
已访问。添加(根)
如果根目录已失效:返回-1#快速失败
排队时:
步骤+=1
大小=长度(队列)
对于范围内的i(尺寸):
cur=queue.popleft()
#debug(f“cur:{cur},步骤:{step}”)
如果cur==目标:返回步骤
#收集下一个节点。
#拉伸并添加到队列旁边
对于范围(0,4)内的i:
对于j in[-1,1]:
nxt=cur[:i]+str((int(cur[i])+j+10)%10)+cur[i+1:]
如果(nxt不在deads中)和(nxt不在visited中):
queue.append(nxt)
已访问。添加(nxt)
返回-1#故障案例
案例测试:

def测试(自身):
死区=[“8888”]#0000->0009一步
target=“0009”
答案=1
check=self.solution.openLock(死区、目标)
自我评估资格(回答、检查)
不幸的是,它报告了错误

base)2004年15月15日星期一上午10:48:me@host:~/文档/程序/算法:
$python 752.OpenTheLock.py MyCase.test\u b
调试电流:0000,步骤:1
调试cur:9000,步骤:2
调试电流:1000,步骤:2
调试电流:0900,步骤:2
调试cur:0100,步骤:2
调试cur:0090,步骤:2
调试电流:0010,步骤:2
调试cur:0009,步骤:2
F
======================================================================
失败:测试b(uuu main_uuuuu.MyCase)
----------------------------------------------------------------------
回溯(最近一次呼叫最后一次):
文件“752.OpenTheLock.py”,第184行,在test_b中
自我评估资格(回答、检查)
断言错误:1!=2
----------------------------------------------------------------------
在0.002s内运行1次测试
失败(失败=1)
必须重新启动
步骤=-1

。
----------------------------------------------------------------------
在0.750秒内运行了3次测试
好啊

TePrPATII的java和C++实现使用了预增量<代码> ++STEP<代码>,< /P> 那么,检查根是否被视为步骤0?

step=-1
是python实现中合适的启动方式吗?

问题:

检查根是否被视为步骤0?
步骤=-1是python实现中的适当启动吗

是的,我们应该在这里使用
step=-1
,因为队列中的第一个元素是
0000
,它不计入结果,所以我们应该将
step
减少到
-1


关于问题:

与此相反,许多实现检查
如果next==target,则返回当前级别的步骤+1
,这将终止检查和拉伸作业混合在一起

这是一种提前停止的方法,因为我们已经知道它不会通过recu中的终止检查