在一块大小为 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:

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

样例 2:

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

样例 3:

给出 board = `[[4,1,2],[5,0,3]]`, 返回 `5`.解释:
至少需要移动5步来解决这个问题。
比如这么做:
移动 0 步之后: [[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]]

样例 4:

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

vector<vector<int>>  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<vector<int>> &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<string>&ret, set<string>&visSet)
{
    int start = findStart(src);
    string str = src;
    vector<int> 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<vector<int>> &board)
{
    int count = 0;
    string target = "123450";
    set<string>visSet;
    queue<string>goVec;
    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;
}

941 · 滑动拼图相关推荐

  1. 滑动拼图验证码操作步骤:_拼图项目:一个不完整的难题

    滑动拼图验证码操作步骤: 马克·雷因霍尔德(Mark Reinhold)最近提议延迟Java 9,以花更多的时间完成项目Jigsaw,这是即将发布的版本的主要功能. 虽然这个决定肯定会使Java的厄运 ...

  2. 滑动拼图验证码操作步骤:_拼图项目:延期的后果

    滑动拼图验证码操作步骤: Mark Reinhold先生于2012年7月宣布 ,他们计划从Java 8撤消Jigsaw项目 ,因为Jigsaw计划于2013年9月(从现在开始一年)推迟其发布. 这个日 ...

  3. html 滑动拼图验证,vue登录滑动拼图验证

    vue登录滑动拼图验证 vue登录滑动拼图验证 一.安装插件: npm install --save vue-monoplasty-slide-verify 二.main.js引入: import S ...

  4. php滑动拼图验证,如何在PHP环境下实现滑动拼图验证

    今许多的网站都用到了滑动拼图的验证方式,因为它操作非常简单,只需要用户点击鼠标拉动,就能完成验证.减少了用户的输入,比较新颖,大大提高了用户体验的同时,安全性也没有降低. 主要类库:PHP的GD库 核 ...

  5. php画拼图滑动验证,滑动拼图验证

    3.逻辑:底部滑块的拖动控制小拼图移动,当其左边距与切割位置x坐标一致,或在一定范围内,即为正确:难点在于切割出来拼图,这一步参考上面链接地址: 5.部分源码如下:/** * @name BlockI ...

  6. uniapp、vue实现滑动拼图验证码

    实际开发工作中,在登陆的时候需要短信验证码,但容易引起爬虫行为,需要用到反爬虫验证码,今天介绍一下拼图验证码,解决验证码反爬虫中的滑动验证码反爬虫. 原理 滑动拼图验证码是在滑块验证码的基础上增加了一 ...

  7. 【VUE】vue实现登录滑动拼图验证的两种方法,纯前端组件验证以及前后端同时验证

    vue实现登录滑动拼图验证的两种方法: 第一种是纯前端组件验证,只能区分是人为操作还是机器操作. 第二种是前后端同时验证,这种方法加上后端校验相对会更安全一些.(注:在最底部加上了同时兼容移动端的方法 ...

  8. 验证码的几种方式-普通图形验证码,滑动拼图,图中点选

    https://blog.csdn.net/zxz_java/article/details/83254469 介绍一些java开源的验证码生成器 普通图形验证码 最为普通的方式,属于比较容易实现,但 ...

  9. 爬虫之极验验证码破解-滑动拼图验证码破解

    滑动拼图验证码破解 前言 步骤分析 第一步,获取原图 第二步 拼接图片 第三步 计算豁口所在位置 第四步 计算拖动距离 模拟拖动 其他 前言 滑动验证码已经流行很多年了,我们在这里尝试一下如何实现滑动 ...

最新文章

  1. SHELL 技能树(持续更新)
  2. hdu 3585(二分+最大团)
  3. 因云而生,全新视角看阿里云服务器硬件方升架构
  4. SSM框架前台传中文到后台乱码问题的解决办法
  5. 类目,延展,协议的基本概念
  6. MySQL Group Replication 部署 (Single Master)
  7. 商业信息敏感、安全处理(口令、数字证书-U盾-密保卡、指纹识别-虹膜识别)...
  8. 机器视觉核心算法——图像预处理
  9. 完成的定义 Definition of Done
  10. 控制文件丢失的恢复(续)
  11. AOP切面用aspectjweaver.jar实现代码
  12. python凹多边形分割_凹多边形分割成凸多边形
  13. snmp No Such Instance currently exists at this OID
  14. 一本通 1194:移动路线
  15. word页眉设置:显示章节标题、奇偶页不同
  16. DC升压直流高压电源模块12V24v转100V150V200V250V300V350v1000伏线性变化电压控制输出
  17. 组合Combination 分布数组计算
  18. Matlab中传递函数的几种输入方式
  19. React Parameter ‘from‘ implicitly has an ‘any‘ type.
  20. Android信息统计和崩溃收集工具

热门文章

  1. 【漏洞】竟然可以盗取swarm测试网电子票?
  2. 【结构型模式五】组合模式
  3. ffmpeg音视频文件音视频流抽取,初步尝试人声分离
  4. vant 组件van-tabbar实现底部导航
  5. 利用matlab求解方程组的解
  6. Arthas(阿尔萨斯) 能为你做什么?
  7. 网页设计:30个灰常漂亮的老外网页设计作品
  8. 计算机应用技术与土木工程,土木工程计算机应用技术4月试题及答案.doc
  9. RabbitMQ入门(三)消息应答与发布确认
  10. 5.2.6 三划分快速排序算法