博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Leetcode 773. Sliding Puzzle
阅读量:6979 次
发布时间:2019-06-27

本文共 2453 字,大约阅读时间需要 8 分钟。

Problem:

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: 1Explanation: Swap the 0 and the 5 in one move.
Input: board = [[1,2,3],[5,4,0]]Output: -1Explanation: No number of moves will make the board solved.
Input: board = [[4,1,2],[5,0,3]]Output: 5Explanation: 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].
Solution:

  这道题乍一看有些蒙,但直觉上来说应该是用DFS/BFS来做,当看到要求最小步数的时候,应该要优先选择BFS。为简化操作将二维数组转化为字符串,然后用visited记录访问过的状态,用常规BFS做即可。

Code:

 

1 class Solution { 2 public: 3     int slidingPuzzle(vector
>& board) { 4 unordered_set
visited; 5 string now = ""; 6 for(int i = 0;i != 2;++i){ 7 for(int j = 0;j != 3;++j) 8 now += to_string(board[i][j]); 9 }10 if(now.compare("123450") == 0) return 0;11 visited.insert(now);12 queue
> q;13 q.push(make_pair(0,now));14 vector
> direction({ { 1,3},{-1,3,1},{-1,3},{-3,1},{-1,-3,1},{-3,-1}});15 while(!q.empty()){16 string front = q.front().second;17 int count = q.front().first;18 q.pop();19 int zeroindex;20 for(int i = 0;i != 6;++i){21 if(front[i] == '0')22 zeroindex = i;23 }24 for(int i = 0;i != direction[zeroindex].size();++i){25 string str = front;26 swap(str[zeroindex],str[zeroindex+direction[zeroindex][i]]);27 if(str.compare("123450") == 0) return count+1;28 if(visited.find(str) == visited.end()){29 visited.insert(str);30 q.push(make_pair(count+1,str));31 }32 }33 }34 return -1;35 }36 };

 

转载于:https://www.cnblogs.com/haoweizh/p/10225281.html

你可能感兴趣的文章
Oracle 11g Release 1 (11.1) PL/SQL_多维 Collection 类型和其异常
查看>>
Linux多线程实践(6) --Posix读写锁解决读者写者问题
查看>>
第 7 章 项目运作
查看>>
云端卫士架构师讲DDoS攻击的智能防御之道
查看>>
百度地图 ip查询 service
查看>>
MySQL5.6.16二进制源码安装详解及一键安装实现
查看>>
ARP(Accounting Resource Planning)项目感想
查看>>
Linux系统基础-管理之用户、权限管理
查看>>
wordpress jquery加载如何实现?
查看>>
Lucene.net: the main concepts
查看>>
mongodb学习笔记6--杂项与补充
查看>>
solrcloud Read and Write Side Fault Tolerance
查看>>
ADF12C 在线预览PDF文件 afinlineFrame
查看>>
iOS Block实现探究
查看>>
nginx虚拟目录配置
查看>>
Python:UTF-8编码转换成GBK编码
查看>>
各种 django 静态文件的配置总结【待续】
查看>>
渐进符号
查看>>
Centos 64位 Install certificate on apache 即走https协议
查看>>
JQuery遮罩层
查看>>