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:
给出 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 · 滑动拼图相关推荐
- 滑动拼图验证码操作步骤:_拼图项目:一个不完整的难题
滑动拼图验证码操作步骤: 马克·雷因霍尔德(Mark Reinhold)最近提议延迟Java 9,以花更多的时间完成项目Jigsaw,这是即将发布的版本的主要功能. 虽然这个决定肯定会使Java的厄运 ...
- 滑动拼图验证码操作步骤:_拼图项目:延期的后果
滑动拼图验证码操作步骤: Mark Reinhold先生于2012年7月宣布 ,他们计划从Java 8撤消Jigsaw项目 ,因为Jigsaw计划于2013年9月(从现在开始一年)推迟其发布. 这个日 ...
- html 滑动拼图验证,vue登录滑动拼图验证
vue登录滑动拼图验证 vue登录滑动拼图验证 一.安装插件: npm install --save vue-monoplasty-slide-verify 二.main.js引入: import S ...
- php滑动拼图验证,如何在PHP环境下实现滑动拼图验证
今许多的网站都用到了滑动拼图的验证方式,因为它操作非常简单,只需要用户点击鼠标拉动,就能完成验证.减少了用户的输入,比较新颖,大大提高了用户体验的同时,安全性也没有降低. 主要类库:PHP的GD库 核 ...
- php画拼图滑动验证,滑动拼图验证
3.逻辑:底部滑块的拖动控制小拼图移动,当其左边距与切割位置x坐标一致,或在一定范围内,即为正确:难点在于切割出来拼图,这一步参考上面链接地址: 5.部分源码如下:/** * @name BlockI ...
- uniapp、vue实现滑动拼图验证码
实际开发工作中,在登陆的时候需要短信验证码,但容易引起爬虫行为,需要用到反爬虫验证码,今天介绍一下拼图验证码,解决验证码反爬虫中的滑动验证码反爬虫. 原理 滑动拼图验证码是在滑块验证码的基础上增加了一 ...
- 【VUE】vue实现登录滑动拼图验证的两种方法,纯前端组件验证以及前后端同时验证
vue实现登录滑动拼图验证的两种方法: 第一种是纯前端组件验证,只能区分是人为操作还是机器操作. 第二种是前后端同时验证,这种方法加上后端校验相对会更安全一些.(注:在最底部加上了同时兼容移动端的方法 ...
- 验证码的几种方式-普通图形验证码,滑动拼图,图中点选
https://blog.csdn.net/zxz_java/article/details/83254469 介绍一些java开源的验证码生成器 普通图形验证码 最为普通的方式,属于比较容易实现,但 ...
- 爬虫之极验验证码破解-滑动拼图验证码破解
滑动拼图验证码破解 前言 步骤分析 第一步,获取原图 第二步 拼接图片 第三步 计算豁口所在位置 第四步 计算拖动距离 模拟拖动 其他 前言 滑动验证码已经流行很多年了,我们在这里尝试一下如何实现滑动 ...
最新文章
- SHELL 技能树(持续更新)
- hdu 3585(二分+最大团)
- 因云而生,全新视角看阿里云服务器硬件方升架构
- SSM框架前台传中文到后台乱码问题的解决办法
- 类目,延展,协议的基本概念
- MySQL Group Replication 部署 (Single Master)
- 商业信息敏感、安全处理(口令、数字证书-U盾-密保卡、指纹识别-虹膜识别)...
- 机器视觉核心算法——图像预处理
- 完成的定义 Definition of Done
- 控制文件丢失的恢复(续)
- AOP切面用aspectjweaver.jar实现代码
- python凹多边形分割_凹多边形分割成凸多边形
- snmp No Such Instance currently exists at this OID
- 一本通 1194:移动路线
- word页眉设置:显示章节标题、奇偶页不同
- DC升压直流高压电源模块12V24v转100V150V200V250V300V350v1000伏线性变化电压控制输出
- 组合Combination 分布数组计算
- Matlab中传递函数的几种输入方式
- React Parameter ‘from‘ implicitly has an ‘any‘ type.
- Android信息统计和崩溃收集工具