突然想到一个有趣的题,关于华容道的

Smile_Tiger 2011-01-24 10:21:32
已知: 棋盘为4X5的格子,棋子有1个曹操(2X2),1个关羽(2X1的横向),4个其他五虎上将(1X2的竖向),4个小兵(1X1)

棋子都摆上棋盘后,余两个空格。

问: 求所有棋盘状态的数目。


我没有细想就发过来了
...全文
193 点赞 收藏 8
写回复
8 条回复
Smile_Tiger 2011年03月08日
只是散分。
回复 点赞
somebody 2011年02月01日
当然这中间还可做一些性能优化。比如插入*(小兵)时,剩下的所有位置都可以放置,不存在能不能放得下的问题。所以不必每个检索。直接计算剩下所有格子数。然后从其中选择小兵个数个位置来放置小兵即可!每个小兵都一样。
本题:
4*5-1*(2*2)-1*(2*1)-4*(1*2)=20-4-2-8=6;
小兵个数为4;
则:其他放置完成后,小兵放置方法为:C6取4=6*5/(2*1)=15
不用每个都去递归!
回复 点赞
somebody 2011年02月01日
全盘检索就可以了。格子抽象成数组。
用*代替a[4][5]的格子:
* * * * *
* * * * *
* * * * *
* * * * *
用如下图形:
曹操: 关羽 4五虎上将 小兵
* * * * * *
* * *
首先从占有格子最多的检索(如上图从左至右):
1.设置初始检索位置,置a[4][5]的每个格子都为0
2.开始检索;检索到可以放下一颗当前棋子时,检索位置置1。这里位置包含了棋子所占位置。比如:把曹操放在首个位置,则a[0][0],a01,a10,a11都被置成了1。
3.下次检索时从顺序表物理地址最小的非1位置开始。重复2步,直到所有的当前棋子放完。
此过程中如出现无法放置棋子则返回(即数组a全部置0进入刚才检索的下一个位置)。
4.上一种棋子放置完成后,调换棋子种类,设定下一个放置棋子种类。重复2、3步。
5.重复2\3\4.直到所有情况算出。
回复 点赞
huatuo20002008 2011年01月31日


[Quote=引用 3 楼 superdullwolf 的回复:]

其实就是填格子,1是有,0是无,每个棋子都提前固定好01,盲目的递归去填,输出正好可以填满的不重复的解,就可以了。
[/Quote]

没看明白,能否说得稍详细些,谢谢!
回复 点赞
zhaolinger2 2011年01月24日
用和走迷宫类似的思路就能解。
回复 点赞
booksoon 2011年01月24日
415800
回复 点赞
超级大笨狼 2011年01月24日
其实就是填格子,1是有,0是无,每个棋子都提前固定好01,盲目的递归去填,输出正好可以填满的不重复的解,就可以了。
回复 点赞
丈八涯 2011年01月24日
求所有棋盘状态的数目
也就是所有棋子全部放下(不旋转)的状态集。
属于覆盖问题,空格部分可以看做两个小棋子。
回复 点赞
发动态
发帖子
数据结构与算法
创建于2007-08-27

2.9w+

社区成员

3.4w+

社区内容

数据结构与算法相关内容讨论专区
社区公告
暂无公告