您的位置:首页 > 产品设计 > UI/UE

UESTC Training for Search Algorithm——E

2012-05-20 01:20 295 查看
棋盘游戏

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就没有了,下次一定写了
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: