UESTC Training for Search Algorithm——E

棋盘游戏

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就没有了,下次一定写了


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值