广度优先搜索+map标记状态
题目
http://acm.hdu.edu.cn/showproblem.php?pid=1067
题意
首先给出28(4×7)张卡片和一个4×8的表格,每张卡片都有一个数字,分别是11~17、21~27、31~37和41~47。初始时将卡片随机放入表格里除第一列以外的其他位置,如下图:
然后将数字11的卡片放到第一列的第一行,数字21的卡片放到第一列的第二行,数字31和41的卡片类似,如下图:
接下来需要移动卡片,移动的规则是,只能将卡片移动到空白格子上,且移动到空白格子上的卡片,必须是比空白格子左边卡片上的数字大1的那张。比如上图的第一行的第二列空白格子,其左边卡片上的数字是42,那么只能将数字为43的卡片移动到该空白格子上。在移动过若干次卡片后,如果卡片的位置能变成下图所示的样子,输出最小移动的次数,否则输出-1。
解题思路
这题要计算最小移动的次数,首先想到的是用广度优先搜索,比较麻烦的是标记每次移动后状态。可以将表格的状态转化为一个长度为28的字符串(4×7,表格第一列不会被移动,所以不用标记),然后用map的这个字符串来判断该状态是否被标记过。
代码
1 |
|