【BFS】打开转盘锁

752. 打开转盘锁 - 力扣(LeetCode) (leetcode-cn.com)

1.BFS

按找最短路径的方法,先BFS穷举,然后每一层进行判断。

 

代码如下:

运行结果超时

class Solution(object):
    def openLock(self, deadends, target):
        """
        :type deadends: List[str]
        :type target: str
        :rtype: int
        """
        def up(curnum,inx):
            tar=curnum[inx]
            if tar=='9':
                tar='0'
            else:
                tar=str(int(tar)+1)
            if inx==0:
                return str(tar+curnum[inx+1:])
            elif inx==len(curnum)-1:
                return str(curnum[:inx]+tar)
            else:
                return str(curnum[:inx]+tar+curnum[inx+1:])
        def down(curnum,inx):
            tar=curnum[inx]
            if tar=='0':
                tar='9'
            else:
                tar=str(int(tar)-1)
            if inx==0:
                return str(tar+curnum[inx+1:])
            elif inx==len(curnum)-1:
                return str(curnum[:inx]+tar)
            else:
                return str(curnum[:inx]+tar+curnum[inx+1:])
        if target=='0000':
            return 0
        if '0000' in deadends:
            return -1
        queue=[]
        visited=[]
        queue.append('0000')
        depth=0
        while queue:
            tmp=[]
            while queue:
                cur=queue.pop()
                if cur in deadends:
                    continue
                if cur==target:
                    return depth
                visited.append(cur)
                for i in range(4):
                    upper=up(cur,i)
                    if upper not in visited:
                        tmp.append(upper)
                    downer=down(cur,i)
                    if downer not in visited:
                        tmp.append(downer)
            queue=tmp
            depth+=1
        return -1
                
                

2.双向BFS

q1,q2双向搜索,每次用较短的q2来搜索,减少搜索范围

class Solution(object):
    def openLock(self, deadends, target):
        """
        :type deadends: List[str]
        :type target: str
        :rtype: int
        """
        def up(curnum,inx):
            tar=curnum[inx]
            if tar=='9':
                tar='0'
            else:
                tar=str(int(tar)+1)
            if inx==0:
                return str(tar+curnum[inx+1:])
            elif inx==len(curnum)-1:
                return str(curnum[:inx]+tar)
            else:
                return str(curnum[:inx]+tar+curnum[inx+1:])
        def down(curnum,inx):
            tar=curnum[inx]
            if tar=='0':
                tar='9'
            else:
                tar=str(int(tar)-1)
            if inx==0:
                return str(tar+curnum[inx+1:])
            elif inx==len(curnum)-1:
                return str(curnum[:inx]+tar)
            else:
                return str(curnum[:inx]+tar+curnum[inx+1:])
        if target=='0000':
            return 0
        if '0000' in deadends:
            return -1
        q1,q2=[],[]
        visited=[]
        q1.append('0000')
        q2.append(target)
        depth=0
        while q1 and q2:
            tmp=[]
            while q1:
                cur=q1.pop()
                if cur in deadends:
                    continue
                if cur in q2:
                    return depth
                visited.append(cur)
                for i in range(4):
                    upper=up(cur,i)
                    if upper not in visited:
                        tmp.append(upper)
                    downer=down(cur,i)
                    if downer not in visited:
                        tmp.append(downer)
            q1=q2
            q2=tmp
            depth+=1
        return -1

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值