【leetcode】Sliding Puzzle
题目如下:
On a 2x3 board, there are 5 tiles represented by the integers 1 through 5, and an empty square represented by 0.
A move consists of choosing 0 and a 4-directionally adjacent number and swapping it.
The state of the board is solved if and only if the board is [[1,2,3],[4,5,0]].
Given a puzzle board, return the least number of moves required so that the state of the board is solved.
If it is impossible for the state of the board to be solved, return -1. Examples:
Input: board = [[1,2,3],[4,0,5]]
Output: 1
Explanation: Swap the 0 and the 5 in one move.
Input: board = [[1,2,3],[5,4,0]]
Output: -1
Explanation: No number of moves will make the board solved.
Input: board = [[4,1,2],[5,0,3]]
Output: 5
Explanation: 5 is the smallest number of moves that solves the board.
An example path:
After move 0: [[4,1,2],[5,0,3]]
After move 1: [[4,1,2],[0,5,3]]
After move 2: [[0,1,2],[4,5,3]]
After move 3: [[1,0,2],[4,5,3]]
After move 4: [[1,2,0],[4,5,3]]
After move 5: [[1,2,3],[4,5,0]]
Input: board = [[3,2,4],[1,5,0]]
Output: 14
Note:
board will be a 2 x 3 array as described above.
board[i][j] will be a permutation of [0, 1, 2, 3, 4, 5].
解题思路:对于这个题目,我也没想到特别好的方法。不过既然题目约定了是一个2*3的board,那么基本上就不用考虑性能问题了,所以可以简单粗暴的用穷举法。怎么穷举呢,最简单的是倒推,因为如果题目有解的话最终的结果一定是 [[1,2,3],[4,5,0]],我们可以用这个状态作为起点,计算出多少次移动能移动到和输入board一样的状态。因为只能移动0,而且只有上下左右四种移动方向,这个就是一个很典型的广度遍历的场景,注意每次移动后都要记录当前的状态,也要记录到达这个状态需要移动的次数,用来和board比较,如果一致就不需要再继续移动了。最后,当然也可以事先把所有能移动到达的状态先计算出来并进行缓存,之后就直接和board进行比较就行了。
完整代码:
import copy
class Solution(object):
def slidingPuzzle(self, board):
"""
:type board: List[List[int]]
:rtype: int
"""
pass
def toString(self,b):
s = ''
for i in b:
for j in i:
s += str(j)
return s
def getIndex(self,b):
for i in range(len(b)):
for j in range(len(b[0])):
if b[i][j] == 0:
return [i,j]
return []
def swap(self,b,x1,y1,x2,y2):
t = b[x1][y1]
b[x1][y1] = b[x2][y2]
b[x2][y2] = t
def slidingPuzzle(self, board):
des = [[1,2,3],[4,5,0]]
#print self.toString(board)
res = []
res.append(self.toString(des))
stack = []
stack.append([des,0]) while len(stack) > 0:
e = stack[0]
if e[0] == board:
return e[1]
#break
del stack[0] #print 'step',e[1]
#print e[0][0]
#print e[0][1]
#print '**********' inx = self.getIndex(e[0])
#up:
if inx[0] - 1 == 0:
bup = copy.deepcopy(e[0])
self.swap(bup, inx[0], inx[1], inx[0] -1,inx[1])
if self.toString(bup) not in res:
res.append(self.toString(bup))
stack.append([bup,e[1]+1])
#down
if inx[0] + 1 == 1:
bdown = copy.deepcopy(e[0])
self.swap(bdown, inx[0], inx[1], inx[0] + 1,inx[1])
if self.toString(bdown) not in res:
res.append(self.toString(bdown))
stack.append([bdown,e[1]+1])
#left
if inx[1] - 1 >= 0:
bleft = copy.deepcopy(e[0])
self.swap(bleft, inx[0], inx[1], inx[0],inx[1]-1)
if self.toString(bleft) not in res:
res.append(self.toString(bleft))
stack.append([bleft,e[1]+1])
#right
if inx[1] + 1 <= 2:
bright = copy.deepcopy(e[0])
self.swap(bright, inx[0], inx[1], inx[0] ,inx[1]+1)
if self.toString(bright) not in res:
res.append(self.toString(bright))
stack.append([bright,e[1]+1])
return -1
【leetcode】Sliding Puzzle的更多相关文章
- 【LeetCode】BFS(共43题)
[101]Symmetric Tree 判断一棵树是不是对称. 题解:直接递归判断了,感觉和bfs没有什么强联系,当然如果你一定要用queue改写的话,勉强也能算bfs. // 这个题目的重点是 比较 ...
- 【LeetCode】堆 heap(共31题)
链接:https://leetcode.com/tag/heap/ [23] Merge k Sorted Lists [215] Kth Largest Element in an Array (无 ...
- 【LeetCode】Minimum Depth of Binary Tree 二叉树的最小深度 java
[LeetCode]Minimum Depth of Binary Tree Given a binary tree, find its minimum depth. The minimum dept ...
- 【Leetcode】Pascal's Triangle II
Given an index k, return the kth row of the Pascal's triangle. For example, given k = 3, Return [1,3 ...
- 53. Maximum Subarray【leetcode】
53. Maximum Subarray[leetcode] Find the contiguous subarray within an array (containing at least one ...
- 27. Remove Element【leetcode】
27. Remove Element[leetcode] Given an array and a value, remove all instances of that value in place ...
- 【刷题】【LeetCode】007-整数反转-easy
[刷题][LeetCode]总 用动画的形式呈现解LeetCode题目的思路 参考链接-空 007-整数反转 方法: 弹出和推入数字 & 溢出前进行检查 思路: 我们可以一次构建反转整数的一位 ...
- 【刷题】【LeetCode】000-十大经典排序算法
[刷题][LeetCode]总 用动画的形式呈现解LeetCode题目的思路 参考链接 000-十大经典排序算法
- 【leetcode】893. Groups of Special-Equivalent Strings
Algorithm [leetcode]893. Groups of Special-Equivalent Strings https://leetcode.com/problems/groups-o ...
随机推荐
- 使用vue做项目如何提高代码效率
最近做了两个vue项目,算上之前做的两个项目,总共有四个vue项目的经验了,但是总体来说写的代码质量不是很高,体现在以下几点 1.代码没有高效的复用 自从使用vue做项目之后,以前使用面向过程变成的习 ...
- 【VS开发】 自己编写一个简单的ActiveX控件——详尽教程
最近开始学ActiveX控件编程,上手不太容易,上网想找相关教程也没合适的,最后还是在师哥的指导下完成了第一个简单控件的开发,现在把开发过程贴出来与大家分享一下~ (环境说明--平台:vs2005:语 ...
- [DS+Algo] 011 哈希
目录 1. hash 函数 2. 哈希表 3. 密码存储 1. hash 函数 关键词 任意长度输入 固定长度输出 特征 理论上输入跟输出并不是一对一 实际使用假定不会出现碰撞或者冲突 常用算法 (M ...
- numpy数组的索引和切片
numpy数组的索引和切片 基本切片操作 >>> import numpy as np >>> arr=np.arange(10) >>> arr ...
- xml文件简单读取,循环遍历
xml文件的简单读取出来生成dom4j.Document对象树,循环遍历获取节点 例子: import java.util.Iterator; import org.dom4j.Document; i ...
- Layui数据表格模型
视图模型 package com.meiyou.model; import org.springframework.context.annotation.Bean; import java.io.Se ...
- CentOS 7 安装MongoDB 4.0
1.创建yum源文件 /etc/yum.repos.d/mongodb-org-4.0.repo [mongodb-org-4.0] name=MongoDB Repository baseurl=h ...
- SQL语句优化 学习笔记
sql语句时间花在哪了? 1 等待时间 2 执行时间 这两个时间并非孤立的,单条语句执行的快 其他语句等待的时间就少 执行时间花在哪了? 1 查找 沿着索引查找 慢者可能全表扫描 2 取出 查到行后, ...
- linux复习2:Fedora17系统的安装和删除
一.Linux系统下硬盘的基本知识 1.分区命名方案: (1)Linux系统使用字母和数字的组合来指代硬盘分区 (2)Linux系统使用一种更加灵活的命名方案,该命名方案是基于文件的,文件的命名格式为 ...
- js apply与call的用法与区别
apply和call function Person(c, d) { return this.a + this.b + c + d } var o = {a: 1, b: 2} Person.cal ...