leetcode 滑动谜题

滑动谜题

在一个 2 x 3 的板上(board)有 5 块砖瓦,用数字 1~5 来表示, 以及一块空缺用 0 来表示.

一次移动定义为选择 0 与一个相邻的数字(上下左右)进行交换.

最终当板 board 的结果是 [[1,2,3],[4,5,0]] 谜板被解开。

给出一个谜板的初始状态,返回最少可以通过多少次移动解开谜板,如果不能解开谜板,则返回 -1 。

来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/sliding-puzzle 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

广度

bsf




def tostr(board):
    ret = ''
    for i in range(len(board)):
        for j in range(len(board[0])):
            ret += str(board[i][j])
    return ret


def f(board):
    xxx = {0:[1,3], 1: [0,2,4], 2: [1,5], 3: [0,4], 4: [1,3,5], 5:[2,4]}
    seen = set()
    queue = [(tostr(board), 0)]
    ans = float('inf')

    while queue:
        s,count = queue.pop(0)
        if s == "123450":
            ans = min(ans, count)
        if s in seen:
            continue
        seen.add(s)
        s = list(s)
        pos_0 = s.index('0')
        for i in xxx[pos_0]:
            s[pos_0], s[i] = s[i], s[pos_0]
            queue.append((''.join(s), count + 1))
            s[pos_0], s[i] = s[i], s[pos_0]

    if ans == float('inf'):
        return -1
    return ans

Loading Disqus comments...
Table of Contents