【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 ...
随机推荐
- 哈希表 HashTable(又名散列表)
简介 其实通过标题上哈希表的英文名HashTable,我们就可以看出这是一个组合的数据结构Hash+Table. Hash是什么?它是一个函数,作用可以通过一个公式来表示: index = HashF ...
- C++ 简介 基本语法 注释
一.第一个 C++ 程序 #include <iostream> using namespace std; int main() { cout << "Hello, ...
- Error: java: 无法访问org.apache.hadoop.mapred.JobConf 找不到org.apache.hadoop.mapred.JobConf的类文件
Error: java: 无法访问org.apache.hadoop.mapred.JobConf 找不到org.apache.hadoop.mapred.JobConf的类文件 出现此异常,是缺 ...
- Luogu P3647 [APIO2014]连珠线
题目 换根dp. 显然对于给定的一棵有根树,蓝线都不能拐弯. 设\(f_{u,0}\)表示\(u\)不是蓝线中点时子树内的答案,\(f_{u,1}\)表示\(u\)是蓝线中点时子树内的答案.(以\(1 ...
- PHP控制session时效(转)
1.php session 有效期php的session有效期默认是1440秒(24分钟),如果客户端超过24分钟没有刷新,当前session会被回收,失效. 当用户关闭浏览器,会话结束,sessio ...
- TCP协议的粘包现象和解决方法
# 粘包现象 # serverimport socket sk = socket.socket()sk.bind(('127.0.0.1', 8005))sk.listen() conn, addr ...
- Python程序结构(sys、os)
一.Python组成结构 Python程序一般由包package.模块moudle.函数function组成.具体关系如下图:
- JavaEE--JSP指令
JSP指令用于提供整个JSP页面的相关信息以及用于JSP页面与容器之间的通信.JSP指令有三种:page指令.include指令.taglib指令 1.page指令 用于设定整个JSP页面的属性和相关 ...
- Android 之 悬浮窗口
1. 创建并设置 WindowManager 类 WindowManager mWindowManager; // 取得系统窗体 mWindowManager = (WindowManager) ...
- AGC015E Mr.Aoki Incubator
atcoder luogu 首先可以考虑给一个人\(A\)染色.其他人被染色,要么被本来在后面的速度更快的人染色,要么被在前面的更慢的人染色.然后假设一个速度比最开始那个人慢的人\(B\)最后被染色了 ...