首页 > 其他分享 >773. 滑动谜题

773. 滑动谜题

时间:2023-04-04 18:45:52浏览次数:37  
标签:nxt return 773 start mask 谜题 vis ls 滑动

题目描述

数字华容道,只有6个数字
问把0换到最后最少需要多少步?

f1-构建状态表示的mask + bfs

基本分析

  1. bfs的时候,当前状态怎么表示?把矩阵拉平,变成字符串
  2. 怎么快速可以得到某个字符串可以变成哪些字符串?(1)怎么快速知道不同情况下0周围的索引?枚举余处理(2)怎么知道不同mask对应的可产生的mask?在以上基础上定义函数实现
  3. bfs的时候怎么入队和去重?入队的内容是mask,用vis数组去重

代码

class Solution:
    def slidingPuzzle(self, board: List[List[int]]) -> int:
        mp = [[1, 3], [0, 2, 4], [1, 5], [0, 4], [1, 3, 5], [2, 4]]

        def getnei(mask):
            ans = []
            ls = list(mask)
            i = ls.index('0')
            for j in mp[i]:
                ls[j], ls[i] = ls[i], ls[j]
                ans.append(''.join(ls))
                ls[j], ls[i] = ls[i], ls[j]
            return ans
        
        start_mask = "".join(str(i) for i in sum(board, []))
        if start_mask == "123450":
            return 0

        q = deque([start_mask])
        vis = {start_mask}
        step = 0

        while q:
            step += 1
            for _ in range(len(q)):
                cur_mask = q.popleft()
                for nxt_mask in getnei(cur_mask):
                    if nxt_mask == "123450":
                        return step
                    if not nxt_mask in vis:
                        vis.add(nxt_mask)
                        q.append(nxt_mask)
        
        return -1

总结

  1. 这里有其他数字,不考虑2进制压缩,而是直接拉平变成字符串,利用字符串的特性进行哈希。
  2. 枚举mask可以产生哪些新的mask时候,这里是直接返回了所有结果;也可以写成yield的形式。
  3. 在入队之前就需要判断一下mask,看是不是已经满足要求

标签:nxt,return,773,start,mask,谜题,vis,ls,滑动
From: https://www.cnblogs.com/zk-icewall/p/17287379.html

相关文章

  • 直播小程序源码,小程序页面左右滑动如何解决
    直播小程序源码,小程序页面左右滑动如何解决1、css解决//最外层父元素 width:100%;overflow-x:hidden;​2、pages.json中配置     {"path":"platforms/mp-weixin/mine/mine","style":{          //disableScroll:控制当前页面不可滑动"disabl......
  • 力扣-数组-滑动窗口
    题目顺序209长度最小的子数组,904水果成篮解题思路1.滑动窗口求解的题目中,关键词为”求解连续“2.暴力解法是双重for循环,相当于对滑动窗口的起始和终止点都遍历3.滑动窗口求解是,只遍历终止点,当sum符合条件时,start++,向前一步缩小窗口4.终止条件是终止点end遍历完  1c......
  • C语言中的窗口滑动技术
    学习文章:C语言中的窗口滑动技术C语言中的窗口滑动技术循环几乎是每个复杂问题的一部分。太多的循环/嵌套循环会增加所需的时间,从而增加程序的时间复杂性。窗口滑动技术是一种计算技术,用于减少程序中使用的嵌套循环的数量,通过用单个循环代替嵌套循环来提高程序的效率。如果......
  • 滑动窗口-leetcode344-反转字符出啊
    编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组s的形式给出。不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用O(1)的额外空间解决这一问题。示例1:输入:s=["h","e","l","l","o"]输出:["o","l","l","e","h"]示例......
  • 滑动窗口-leetcode-167-俩树之和
    以长度为2的整数数组[index1,index2]的形式返回这两个整数的下标index1和index2。你可以假设每个输入只对应唯一的答案,而且你不可以重复使用相同的元素。你所设计的解决方案必须只使用常量级的额外空间。示例1:输入:numbers=[2,7,11,15],target=9输出:[1,2]......
  • 单调队列与滑动窗口一
    单调队列--滑动窗口最值问题显然O(n^2)的时间复杂度是无法接受的我们先考虑滑动窗口滑动过程中最大值的问题过程即为我们想要维护每个滑动区间的最大值,当新插入一个元素前,我们把这个区间的第一个元素移除,插入新元素,并想在尽可能贴近O(1)的时间内得到该区间的最大值......
  • POJ 2773 Happy 2006 二分+容斥原理(二进制枚举或dfs)
    Happy2006TimeLimit: 3000MS MemoryLimit: 65536KTotalSubmissions: 14003 Accepted: 4946DescriptionTwopositiveintegersaresaidtoberelativelyprimetoeachotheriftheGreatCommonDivisor(GCD)is1.Forinstance,1,3,5,7,9...areallrelativel......
  • 对于数据链路层滑动窗口协议中窗口大小的总结
    3.4节中介绍了三种滑动窗口协议:1位滑动窗口协议、GBN协议、SR协议。1位滑动窗口协议本质上就是一种全双工的停等式协议,它的发送窗口和接收窗口大小都是1,在此不做赘述,我主要分析后两种协议的窗口大小。在SR协议中,窗口大小默认满足如下两个基本条件:发送窗口大小=接收窗口大小发......
  • vue 实现下拉滑动触底加载
    实现下拉滑动触底加载可以分为以下几个步骤:监听滚动事件,判断是否到达底部。到达底部后,发起数据请求,获取数据。将获取到的数据添加到页面上。下面是一个基于Vue......
  • 【单调队列】LeetCode 239. 滑动窗口最大值
    题目链接239.滑动窗口最大值思路单调队列的使用方法,可以参考【单调队列】LeetCode面试题59-II.队列的最大值在本题中将滑动窗口的移动看作往队列中放数和取数的过......