棋盘游戏
Description
最近昀昀学习到了一种新的棋盘游戏,这是一个在一个N*N的格子棋盘上去搞M个棋子的游戏,游戏的规则有下列几条:
1、棋盘上有且仅有一个出口
2、开始时没有哪个棋子在出口,而且所有棋子都不相邻(这里的相邻是指上下左右四个方向)
3、M个棋子分别记为1到M
4、每个时刻你可以移动一个棋子向它相邻的四个格子移动一步
5、你需要保证任意时刻棋盘上所有棋子都不相邻
6、只有当前棋盘上编号最小的棋子移动到出口时才能取走改棋子。
7、所有棋子都移走的时候游戏结束
对于一个给定的游戏局面,昀昀最少要多少步才能结束这个游戏呢?
Input
第一行有一个整数T,(T<=200),表示测试数据的组数。
对于每一组数据,第一行是两个整数N,M,其中2<=N<=6,1<=M<=4。
接下来是一个N*N的棋盘,其中'o'代表空格子,'x'代表出口,其余的1到M代表这M个棋子。
保证数据是合法的。
Output
对于每一组数据输出最少步数,如果无解输出-1。
Sample Input
2
3 2
x2o
ooo
oo1
3 3
xo1
o2o
3oo
Sample Output
7
-1
算法思想:
用DFS的A*搜索,估值函数是每个棋子与出口的曼哈顿距离,满足可接纳性。每次BFS时按照代价
由小到大的搜索,每次移动一枚棋子时判断是否可以移动,如果不能,移动它周围的。还是用一
个状态数组保存真实的状态,真实的状态的hash值可以用一个二进制数表示,棋盘上某个地方有
棋子就设为1,没有就为0,然后再给他转化成10进制数。BFS中用到的队列中的每个元素的属性应
该有三个:状态hash成的二进制数对应的十进制数,走到这个状态花费的步数,还有就是此状态
下棋子上的数字最小的元素所在的位子(还是十进制数,点(x,y)可以给他化成 pos=x*行号+y 这
个十进制数)
CODE:
最近各种作业缠身,又是电子实验软件仿真,又是英语课上老师要求的小演讲,还有堆了近一个月的作业,
各种实验报告堆积,实在是抽不出时间了,也没有验证上面的算法的正确性,具体的细节肯定还有问题
,CODE就没有了,下次一定写了