leetcode773+类似于华容道,最少步数。BFS

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u013554860/article/details/88081158

https://leetcode.com/problems/sliding-puzzle/

class Solution {
public:
    int slidingPuzzle(vector<vector<int>>& board) {
        int res = 0, m = board.size(), n = board[0].size();
        string target = "123450", start = "";
        vector<vector<int>> dirs{{1, 3}, {0, 2, 4}, {1,5}, {0,4}, {1,3,5},{2,4}}; //各个位置0能达到的位置
        for(int i=0; i<m; i++){
            for(int j=0; j<n; j++){
                start += to_string(board[i][j]);
            }
        }
        set<string> visited; //判重
        visited.insert(start);
        queue<string> Q;
        Q.push(start);
        while(!Q.empty()){
            for(int i=Q.size()-1; i>=0; i--){
                string cur = Q.front(); Q.pop();
                if(cur==target) return res;
                int zero_idx = cur.find('0');
                for(int dir: dirs[zero_idx]){
                    string cand = cur; //当前父节点产生多个子节点
                    swap(cand[dir], cand[zero_idx]); //变化
                    if(visited.count(cand)) continue;
                    visited.insert(cand);
                    Q.push(cand);
                }
            }
            res += 1;
        }
        return -1;
    }
};

猜你喜欢

转载自blog.csdn.net/u013554860/article/details/88081158