IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> LeetCode_BFS_困难_773. 滑动谜题 -> 正文阅读

[数据结构与算法]LeetCode_BFS_困难_773. 滑动谜题

1.题目

在一个 2 x 3 的板上(board)有 5 块砖瓦,用数字 1~5 来表示, 以及一块空缺用 0 来表示。一次移动定义为选择 0 与一个相邻的数字(上下左右)进行交换。

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

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

示例 1:
在这里插入图片描述
输入:board = [[1,2,3],[4,0,5]]
输出:1
解释:交换 0 和 5,1 步完成

示例 2:
在这里插入图片描述
输入:board = [[1,2,3],[5,4,0]]
输出:-1
解释:没有办法完成谜板

示例 3:
在这里插入图片描述
输入:board = [[4,1,2],[5,0,3]]
输出:5
解释:
最少完成谜板的最少移动次数是 5 ,
一种移动路径:
尚未移动: [[4,1,2],[5,0,3]]
移动 1 次: [[4,1,2],[0,5,3]]
移动 2 次: [[0,1,2],[4,5,3]]
移动 3 次: [[1,0,2],[4,5,3]]
移动 4 次: [[1,2,0],[4,5,3]]
移动 5 次: [[1,2,3],[4,5,0]]

提示:
board.length == 2
board[i].length == 3
0 <= board[i][j] <= 5
board[i][j] 中每个值都 不同

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/sliding-puzzle

2.思路

(1)BFS
思路参考如何用 BFS 算法秒杀各种智力题

3.代码实现(Java)

//思路1————BFS
class Solution {
    public int slidingPuzzle(int[][] board) {
        int m = 2;
        int n = 3;
        StringBuilder sBuilder = new StringBuilder();
        //将 2x3 的数组转换为字符串,然后将其作为 BFS 的起点
        for (int i = 0; i < m; i++) {
            for (int j = 0; j < n; j++) {
                sBuilder.append(board[i][j]);
            }
        }
        //可将数组内数字交换结束后对应的字符串"123450"看作终点
        String target = "123450";
        String start = sBuilder.toString();
        /*
            记录一维字符串的相邻索引
            例如 start = "123405",在原数组中与数字 1 相邻的数字有 2 和 4,
            那么它们在字符串 start 中的索引为{1, 3},即 neighbor[0] = {1, 3}
        */
        int[][] neighbor = new int[][] {
            {1, 3},         //board[0][0]
            {0, 4, 2},      //board[0][1]
            {1, 5},         //board[0][2]
            {0, 4},         //board[1][0]
            {3, 1, 5},      //board[1][1]
            {4, 2}          //board[1][2]
        };
        /*****BFS算法框架*****/
        Queue<String> queue = new LinkedList<>();
        //记录已经交换数字后得到的字符串,防止在遍历时走回头路
        HashSet<String> visited = new HashSet<>();
        //记录最少移动解开谜板的次数,初始值为 0
        int minCnt = 0;
        //从起点开始 BFS
        queue.offer(start);
        visited.add(start);
        while (!queue.isEmpty()) {
            int size = queue.size();
            for (int i = 0; i < size; i++) {
                String cur = queue.poll();
                //如果到达终点,则直接返回 minCnt 即可
                if (target.equals(cur)) {
                    return minCnt;
                }
                //找到数字 0 的索引
                int index = 0;
                while (cur.charAt(index) != '0') {
                    index++;
                }
                //将数字 0 和相邻的数字进行交换,即模拟移动的过程
                for (int adj : neighbor[index]) {
                    String newBoard = swap(cur.toCharArray(), adj, index);
                    //防止走回头路
                    if (!visited.contains(newBoard)) {
                        queue.offer(newBoard);
                        visited.add(newBoard);
                    }
                }
            }
            minCnt++;
        }
        //不能解开谜板,则返回 -1
        return -1;
    }

    //将字符数组 chs 中下标为 i 和 j 的字符进行交换,并将 chs 转换为字符串进行返回
    public String swap(char[] chs, int i, int j) {
        char tmp = chs[i];
        chs[i] = chs[j];
        chs[j] = tmp;
        return new String(chs);
    }
}
  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-05-18 17:54:13  更:2022-05-18 17:55:15 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/21 9:06:37-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码