小黑身处迷茫又独立做出了一道困难题,盲审通过收到了面试通知的leetcode之旅:773. 滑动谜题

小黑代码

class Solution:
    def slidingPuzzle(self, board: List[List[int]]) -> int:
        # 记录所有棋盘
        boards = [board]
        # 目标串
        target = [[1, 2, 3], [4, 5, 0]]
        if board == target:
            return 0
        # 行数和列数
        m = len(board)
        n = len(board[0])
        # 寻找0的坐标
        x = y = -1
        for i in range(m):
            for j in range(n):
                if not board[i][j]:
                    x = i
                    y = j
                    break
        # 初始化队列
        q = collections.deque([[(x, y) ,copy.deepcopy(board), 0]])
        while q:
            (x, y), board, num = q.popleft()
            for di in [(1, 0), (-1, 0), (0, 1), (0, -1)]:
                new_x = x + di[0]
                new_y = y + di[1]
               
                if 0 <= new_x < m and 0 <= new_y < n:
                    new_board = copy.deepcopy(board)
                    new_board[x][y], new_board[new_x][new_y] = new_board[new_x][new_y], new_board[x][y]
                    if new_board == target:
                        return num + 1
                    if new_board not in boards:
                        boards.append(new_board)
                        q.append([(new_x, new_y), new_board, num+1])
        return -1

小黑身处迷茫又独立做出了一道困难题,盲审通过收到了面试通知的leetcode之旅:773. 滑动谜题_第1张图片

宽度优先搜索

class Solution:
    NEIGHBOURS = [[1, 3], [0, 2, 4], [1, 5], [0, 4], [1, 3, 5], [2, 4]]
    def slidingPuzzle(self, board: List[List[int]]) -> int:
        def get(status):
            arr = list(status)
            i = arr.index('0')
            # 获取当前位置的邻居
            for t in self.NEIGHBOURS[i]:
                arr[i], arr[t] = arr[t], arr[i]
                yield ''.join(arr)
                arr[i], arr[t] = arr[t], arr[i]
        # 初始状态
        status = ''.join([''.join([str(i) for i in line]) for line in board])
        # 判断时候是答案
        target = '123450'
        if status == target:
            return 0
        # 初始化队列与访问集合
        q = collections.deque([(status, 0)])
        seen = set()
        # 开始进行宽度有限搜索
        while q:
            status, count = q.popleft()
            # 获取孩子结点
            for str_ in get(status):
                if str_ == target:
                    return count + 1
                if str_ not in seen:
                    q.append((str_, count+1))
                    seen.add(str_)
        return -1

小黑身处迷茫又独立做出了一道困难题,盲审通过收到了面试通知的leetcode之旅:773. 滑动谜题_第2张图片

A*算法

# A*算法
class Astar(object):
    def __init__(self, status, g):
        self.status = status
        self.g = g
        self.h = Astar.getH(status)
        self.f = self.g + self.h
    # 曼哈顿距离
    @staticmethod
    def getH(status):
        dist = [
            [0,1,2,1,2,3],
            [1,0,1,2,1,2],
            [2,1,0,3,2,1],
            [1,2,3,0,1,2],
            [2,1,2,1,0,1],
            [3,2,1,2,1,0]
        ]
        ret = 0
        for i in range(len(status)):
            if status[i] != '0':
                ret += dist[i][int(status[i])-1]
        return ret
    def __lt__(self, other):
        return self.f < other.f
class Solution:
    def slidingPuzzle(self, board: List[List[int]]) -> int:
        neighbors = [(1, 3), (0, 2, 4), (1, 5), (0, 4), (1, 3, 5), (2, 4)]
        # 获得邻居
        def get(status):
            arr = list(status)
            i = arr.index('0')
            for t in neighbors[i]:
                arr[t], arr[i] = arr[i], arr[t]
                yield ''.join(arr)
                arr[t], arr[i] = arr[i], arr[t]
        str_ = ''.join([''.join([str(c) for c in line]) for line in board])
        if str_ == '123450':
            return 0
        seen = set([str_])
        q = [Astar(str_, 0)]
        # 遍历优先队列
        while q:
            top = heapq.heappop(q)
            status = top.status
            g = top.g
            for str_ in get(status):
                if str_ == '123450':
                    return g+1
                if str_ not in seen:
                    seen.add(str_)
                    heapq.heappush(q, Astar(str_, g+1))
        return -1

小黑身处迷茫又独立做出了一道困难题,盲审通过收到了面试通知的leetcode之旅:773. 滑动谜题_第3张图片

小黑生活

半马成绩出来啦

小黑身处迷茫又独立做出了一道困难题,盲审通过收到了面试通知的leetcode之旅:773. 滑动谜题_第4张图片
小黑身处迷茫又独立做出了一道困难题,盲审通过收到了面试通知的leetcode之旅:773. 滑动谜题_第5张图片
小黑身处迷茫又独立做出了一道困难题,盲审通过收到了面试通知的leetcode之旅:773. 滑动谜题_第6张图片

早餐宇飞牛肉面

小黑身处迷茫又独立做出了一道困难题,盲审通过收到了面试通知的leetcode之旅:773. 滑动谜题_第7张图片

到公司来个太平洋桃花咖啡

小黑身处迷茫又独立做出了一道困难题,盲审通过收到了面试通知的leetcode之旅:773. 滑动谜题_第8张图片

肚子火气大,午饭就俩水果

小黑身处迷茫又独立做出了一道困难题,盲审通过收到了面试通知的leetcode之旅:773. 滑动谜题_第9张图片

晚饭吉野家鸡肉饭

小黑身处迷茫又独立做出了一道困难题,盲审通过收到了面试通知的leetcode之旅:773. 滑动谜题_第10张图片

晚上从朱辛庄绕远回家

小黑身处迷茫又独立做出了一道困难题,盲审通过收到了面试通知的leetcode之旅:773. 滑动谜题_第11张图片

走个罐排排火

小黑身处迷茫又独立做出了一道困难题,盲审通过收到了面试通知的leetcode之旅:773. 滑动谜题_第12张图片
小黑身处迷茫又独立做出了一道困难题,盲审通过收到了面试通知的leetcode之旅:773. 滑动谜题_第13张图片

回家喝个小酒

小黑身处迷茫又独立做出了一道困难题,盲审通过收到了面试通知的leetcode之旅:773. 滑动谜题_第14张图片

午餐宫保鸡丁饭

小黑身处迷茫又独立做出了一道困难题,盲审通过收到了面试通知的leetcode之旅:773. 滑动谜题_第15张图片

午后咖啡

小黑身处迷茫又独立做出了一道困难题,盲审通过收到了面试通知的leetcode之旅:773. 滑动谜题_第16张图片

晚饭牛杂面套餐

小黑身处迷茫又独立做出了一道困难题,盲审通过收到了面试通知的leetcode之旅:773. 滑动谜题_第17张图片

晚上坐5号线回家

小黑身处迷茫又独立做出了一道困难题,盲审通过收到了面试通知的leetcode之旅:773. 滑动谜题_第18张图片

给中老黑做个表情包啦

小黑身处迷茫又独立做出了一道困难题,盲审通过收到了面试通知的leetcode之旅:773. 滑动谜题_第19张图片

回去烫个头,这段时间折磨的我,理发师说我状态不如两个月前好了hhhh

小黑身处迷茫又独立做出了一道困难题,盲审通过收到了面试通知的leetcode之旅:773. 滑动谜题_第20张图片
小黑身处迷茫又独立做出了一道困难题,盲审通过收到了面试通知的leetcode之旅:773. 滑动谜题_第21张图片
小黑身处迷茫又独立做出了一道困难题,盲审通过收到了面试通知的leetcode之旅:773. 滑动谜题_第22张图片

回去把上次马拉松发的面给吃了

小黑身处迷茫又独立做出了一道困难题,盲审通过收到了面试通知的leetcode之旅:773. 滑动谜题_第23张图片

早上来杯奶油咖啡+曲奇

小黑身处迷茫又独立做出了一道困难题,盲审通过收到了面试通知的leetcode之旅:773. 滑动谜题_第24张图片

午饭一块儿披萨+饮料

小黑身处迷茫又独立做出了一道困难题,盲审通过收到了面试通知的leetcode之旅:773. 滑动谜题_第25张图片
小黑身处迷茫又独立做出了一道困难题,盲审通过收到了面试通知的leetcode之旅:773. 滑动谜题_第26张图片

盲审通过了,成绩还不错,继续加油

小黑身处迷茫又独立做出了一道困难题,盲审通过收到了面试通知的leetcode之旅:773. 滑动谜题_第27张图片

你可能感兴趣的:(leetcode,算法,职场和发展)