力扣773:滑动谜题

力扣773:滑动谜题

https://leetcode.cn/problems/sliding-puzzle/description/

代码内容:

cpp 复制代码
class Solution {
public:
    int slidingPuzzle(vector<vector<int>>& board) {
        string start="";
        for(int i = 0;i<2;i++)
        {
            for(int j = 0;j<3;j++)
            {
                start.push_back(board[i][j]+'0');
            }
        }
        string target = "123450";
        //将二维数组压缩为一维数组的索引,以0所在位置
        vector<vector<int>> index{
            {1,3},
            {0,4,2},
            {1,5},
            {0,4},
            {3,1,5},
            {4,2}
        };
        //BFS
        queue<string> q;
        q.push(start);
        unordered_set<string> visited;
        visited.insert(start);

        int step = 0;
        while(!q.empty())
        {
            int size = q.size();
            for(int i = 0;i<size;i++)
            {
                string cur = q.front();
                q.pop();
                //如果这个是目标值,直接返回
                if(cur == target)
                    return step;
            
            
                //如果不是,查找对应的索引
                int ind;
                 for(ind = 0;cur[ind]!='0';ind++);
                 //查到0的位置,后根据位置进行各个方向交换
                for(int a:index[ind])
                {
                    string new_board = cur;
                    swap(new_board[ind],new_board[a]);
                    //防止重复,缩小时间复杂度
                    if(!visited.count(new_board))
                    {
                        q.push(new_board);
                        visited.insert(new_board);
                    }
                }
            }
            step++;
        }
        return -1;
    }
    
};

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

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

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

这个题目主要就是暴力穷举的做法,将二维数组压缩为一维数组,用广度优先:

我们首先创建两个string类型,保存target和start,而我们的二维数组是int类型,所以我们需要先转换为string,通过将int+'0'来将数字转换为对应的字符.还有一个难点就是将二维数组压缩为一维数组后,一维数组怎么表示二维数组,我们这里使用了一个索引

复制代码

vector<vector<int>> index{ {1,3}, {0,4,2}, {1,5}, {0,4}, {3,1,5}, {4,2} };

这个索引,主要表示'0'在6个不同位置,他可能交换的地方。例如:012345对应的下标为012345,即

|---|---|---|
| 0 | 1 | 2 |
| 3 | 4 | 5 |

我们此时的'0'在一维数组的0号下标,因此,我们进行交换可以向右交换,向下交换,即交换的索引就是1,3;

然后我们通过string类型的队列,一个一个广度搜索比较.

相关推荐
迷途之人不知返2 分钟前
string
c++
liulilittle2 分钟前
OPENPPP2 CTCP 协议栈 + 内置 TC Hairpin NAT 内核态程序
c语言·开发语言·网络·c++·信息与通信·通信
第二只羽毛7 分钟前
C++ 高并发内存池4
java·大数据·linux·c++·算法
散峰而望11 分钟前
【数据结构】并查集从入门到精通:基础实现、路径压缩、扩展域、带权,一网打尽
数据结构·c++·算法·github·剪枝·推荐算法
羚羊角uou16 分钟前
【Linux网络】select详解
linux·服务器·开发语言·网络·c++
C++ 老炮儿的技术栈17 分钟前
c++ this 指针的用途
c语言·开发语言·c++·windows·qt·github
风舞雪凌月20 分钟前
【趣谈】移动系统和桌面系统编程语言思考
java·c语言·c++·python·学习·objective-c·swift
Ricky_Theseus23 分钟前
C++全局变量、局部变量、静态全局变量、静态局部变量的区别
开发语言·c++
小此方24 分钟前
Re:从零开始的 C++ STL篇(十)map/set使用精讲:常见问题与典型用法(上)
开发语言·数据结构·c++·算法·stl
吴梓穆30 分钟前
UE5 c++ 模板函数
java·c++·ue5