LeetCode 773 滑动谜题

  • 分析
    求最小步数的问题一般都是使用BFS,但是这道题目是一个二维的2*3的数组,将二维数组放到队列里比较复杂,这个题可以将二维的问题转化成字符串,重点学习neighbor数组的作用。这里它可以把二维的邻居映射成一维的邻居。
  • 代码
class Solution {
public:
    int slidingPuzzle(vector<vector<int>>& board) {
        int m = 2, n = 3;
        string start = "";
        string target = "123450";

        for(int i = 0; i < m; i++){
            for(int j = 0; j < n; j++){
                start.push_back(board[i][j] + '0');
            }
        }

        //记录一维字符串的相关索引
        vector<vector<int>> neighbor = {
            {1, 3}, {0, 4, 2}, {1, 5}, {0, 4}, {3, 1, 5}, {4, 2}
        };

        //BFS的框架正式开始
        queue<string> que;
        que.push(start);
        unordered_map<string, bool> visited;
        visited[start] = true;
        int step = 0;

        while(!que.empty()){
            int size = que.size();
            while(size--){
                string temp = que.front();
                que.pop();

                if(temp == target) return step;

                int index = 0;
                while(temp[index] != '0') index++;

                for(int data : neighbor[index]){
                    string ss = temp;
                    swap(ss[data], ss[index]);
                    if(!visited[ss]){
                        que.push(ss);
                        visited[ss] = true;
                    }
                }                
            }
            step++;
        }
        return -1;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值