当前位置:网站首页>941 · 滑动拼图
941 · 滑动拼图
2022-08-10 06:33:00 【yinhua405】
在一块大小为 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;
}
边栏推荐
猜你喜欢
![Chapter 11 Database Design Specifications [2. Index and Tuning] [MySQL Advanced]](/img/a5/88699cf7b7fc0ca721977dc07b0602.png)
Chapter 11 Database Design Specifications [2. Index and Tuning] [MySQL Advanced]

761. 特殊的二进制序列

腾讯云宋翔:Kubernetes集群利用率提升实践

【电商业务】外行为何难区别 商品属性与商品规格

椭圆曲线离散对数问题以及求解

Grammar Basics (Judgment Statements)

高质量WordPress下载站模板5play主题

Fiddler(八) - 抓取手机APP的流量-插件Fiddler Orchestra Beta安装&配置

数据库学习之表的约束

Data types for database learning
随机推荐
elf文件与链接脚本
各位大佬 oracle cdc 默认配置 偶发会30秒才抓取到数据 这个怎么优化啊
oracle业务表的数据发生增删改,该表的索引会写redo,undo吗?
金融证券 初级 招股书 要求 黑话1刷数 黑话2底稿 黑话3董监高
2022河南萌新联赛第(五)场:信息工程大学 K - 矩阵生成
语法基础(判断语句)
MySQL事务隔离级别
Qt绘制椭圆曲线的角度问题(离心角和旋转角)
Deep understanding of the array
【论文解读】滴滴智能派单-KDD2018 Large-Scale Order Dispatch in On-Demand Ride-Hailing
COLMAP+OpenMVS realizes 3D reconstruction mesh model of objects
英国国家卫生服务遭受攻击,系统出现大面积故障
Please pay attention to me, thank you.
如何正确理解线程机制中常见的I/O模型,各自主要用来解决什么问题?
Fiddler(八) - 抓取手机APP的流量-插件Fiddler Orchestra Beta安装&配置
order by injection and limit injection, and wide byte injection
个人博客系统
CuteOneP 一款php的OneDrive多网盘挂载程序 带会员 同步等功能
求职
深入理解LTE网络的CDRX