• 941 · 滑动拼图


    在一块大小为 2x3 的板上,有 5 块瓦片,分别用整数 1 到 5 表示,还有一块空地用 0 表示。

    一次移动表示 0 与其相邻的四个方向之一的数字交换位置。

    当且仅当 这块板 上的瓦片摆放状态为 [[1,2,3],[4,5,0]] 时,才能说这块板存在的问题被解决了。

    给定一个拼图板,返回所需的最少移动次数,以解决该板的状态。如果无法解决板的状态,则返回-1。

    • board 会以上面讲的 2 x 3 大小的数组形式输入 。
    • board[i][j] 会是 [0, 1, 2, 3, 4, 5] 中的其中一个值.

    样例

    样例 1:

     
    
    1. 给出 board = `[[1,2,3],[4,0,5]]`, 返回 `1`.
    2. 解释:
    3. 交换05,只需要一步.

    样例 2:

     
    
    1. 给出 board = `[[1,2,3],[5,4,0]]`, 返回 `-1`.
    2. 解释:
    3. 不管移动多少步都无法解决问题。

    样例 3:

     
    
    1. 给出 board = `[[4,1,2],[5,0,3]]`, 返回 `5`.
    2. 解释:
    3. 至少需要移动5步来解决这个问题。
    4. 比如这么做:
    5. 移动 0 步之后: [[4,1,2],[5,0,3]]
    6. 移动 1 步之后: [[4,1,2],[0,5,3]]
    7. 移动 2 步之后: [[0,1,2],[4,5,3]]
    8. 移动 3 步之后: [[1,0,2],[4,5,3]]
    9. 移动 4 步之后: [[1,2,0],[4,5,3]]
    10. 移动 5 步之后: [[1,2,3],[4,5,0]]

    样例 4:

     
    
    给出 board = `[[3,2,4],[1,5,0]]`, 返回 `14`.


    vector>  canGoVec = { {1,3},{0,2,4},{1,5},{0,4},{1,3,5},{2,4} };

    string NumberToString(int x) {
        stringstream ss;
        ss << x;
        return ss.str();
    }

    string toString(vector> &board)
    {
        string ret = "";
        for (int i = 0; i < 2; i++)
        {
            for (int j = 0; j < 3; j++)
            {
                ret.append(NumberToString(board[i][j]));
            }
        }
        return ret;
    }

    int findStart(string &str)
    {
        int i = 0;
        for (; i < 6; i++)
        {
            if (str[i] == '0')
            {
                return i;
            }
        }
    }


    void getAll(string &src, queue&ret, set&visSet)
    {
        int start = findStart(src);
        string str = src;
        vector vec = canGoVec[start];
        for (int i = 0; i < vec.size(); i++)
        {
            char c = str[start];
            str[start] = str[vec[i]];
            str[vec[i]] = c;
            if (visSet.count(str))
            {
                str = src;
                continue;
            }
            ret.push(str);
            visSet.insert(str);
            str = src;
        }
    }


    int slidingPuzzle(vector> &board)
    {
        int count = 0;
        string target = "123450";
        setvisSet;
        queuegoVec;
        string start = toString(board);
        getAll(start,goVec, visSet);
        while (goVec.size()>0)
        {
            int size = goVec.size();
            count++;
            for (int i = 0; i < size; i++)
            {
                string tmp = goVec.front();
                if (tmp == target)
                {
                    return count;
                }
                getAll(tmp, goVec, visSet);
                goVec.pop();
            }
        }
        return -1;
    }
     

     

  • 相关阅读:
    【HTML悬浮提示】
    多因素序贯实验设计(最陡坡法)
    【kali-密码攻击】(5.1.2)密码在线破解:Medusa
    element-ui在vue中如何实现校验两个复选框至少选择一个!
    将vue项目打包成安卓app
    基础矩阵和本质矩阵
    百果园再冲刺港交所上市:扩张靠加盟和放贷,余惠勇夫妇为实控人
    PAT:1020 Tree Traversals
    浅谈 React 与 Vue 更新机制的差异
    ant的get任务
  • 原文地址:https://blog.csdn.net/yinhua405/article/details/126239789