总所周知
俄罗斯方块是通过4个正方形组成7个不同的图形来进行的游戏那么依据同样的生成图形的规则
5个正方形可以生成多少个图形
6个呢?
7
...
n个呢
能够推出来
以及通过编程实现
在编程方面
因为考虑到图形的旋转
感觉比较有难度
俄罗斯方块是通过4个正方形组成7个不同的图形来进行的游戏那么依据同样的生成图形的规则
5个正方形可以生成多少个图形
6个呢?
7
...
n个呢
能够推出来
以及通过编程实现
在编程方面
因为考虑到图形的旋转
感觉比较有难度
这是我之前写的俄罗斯方块的生成物块图形算法,不知道对你有没有帮助,
我的想法是根本不需要记录,也不需要穷举,看下代码你应该能好理解点。
恩 生成方块可以用这种思想 也就是一步一步的构造的思想 第一个不用说 第2个 在前面的图形的周围
加上 有点类似递归的思想 可以解决游戏中的问题但问题来了 LZ不是要做游戏 LZ是想知道有多少种不同的图形 他们是什么 这个就比较难了
C--A--B
|
D
大家发现没有 每个节点 都不能和 他的相邻节点所相连的节点 相连 也就是 C不能和 A周围的CBD相连
这就产生了个很难的图的同构问题
这样做很困难 希望能看到牛人的简单方法
期待ing
期待ing
看看设计这个游戏的人的思想吧。这里有在wiki上的链接。
http://topic.csdn.net/t/20020615/13/805637.html
■ ■ ■ ■四个正方形组成的条形可编为:A=<1 r 2><2 r 3><3 r 4> 还可以编码为:B=<1 l 2><1 r 3><3 r 4>■ ■
■ ■ 四个正方形组成的正方形可编为<1 r 2><2 d3 ><3 l 4>■ ■ ■
■ 倒T形可编为<1 r 2><2 r 3><2 d 4>
2.图同构检测与最小编码
方向序:r<u<l<d
遍历结点先后序M=<a,b> N=<c,d> M≠N
if(a<c) M<N
else if(a=c)
if(b<d)M<N else 即formnode第一比较序,tonode第二节点序
三元组序:取遍历结点先后序为第一比较序,方向序为第二比较序
编码序:类似于字符串的比较,A={a1,a2,...an}B={b1,b2...bn} A<B if exist i,a1=b1,a2=b2...ai=bi,ai+1<bi+1 例如对条形的扩展,<1 r 2> 小于<1 l 2>,所以两种编码A<B
如何检测两个图是不是一样?比较它们的最小编码是不是相等
如何获得一个图的最小编码:从任意节点进行扩展,扩展所有可能的方向,得到一系列的编码,总有一个是最小的,利用早期中断加速。
2.采用树形结构,第n层存储由n个正方形组成的图形,第一层1个,第二层2个,第三层3个,第四层5个……
3.从第n层到第n+1层的扩展方法:
从任意方向上进去扩展:但是要注意扩展的合理性,注意不能使度超过4,不能重复边 例如有了<1 r 2>就不能再有<2 l 3>
对新扩展的图进行最小编码,然后去掉那些相同的图,同时还要保持树形结构
例如:■ ■有六种可行的扩展方法,但是不重复的只有两种
■ ■ □ ■ ■
□
|
e****
就是这个 具体怎么算真想不起来了
假设有10个方块需要排列,那么我们把这10个方块编个号,分别从1-10.然后构建一个表10X10,并且表格也排序为(1-100).
1.先放第1个方块,有10X10=100种方法。
2.在放第2个方块,如果第1个方块在表格最中间,则第2个方块要靠近第1个方块,就只有4种方法(四个面啥)。
3.在放第3个方块,要靠近第2个方块,现在第2方块剩下的面就只有3了。
4.在放第4个方块,要靠近第3个方块,第3个方块也最多3个面啥。
5...(以此类推)
最后的算法复杂度(N*N)*(4)*3*3*3*3*3*3*3*3=26244N*N
当然这个结果里面包含重复了的,这个好办.比如2个方块的序号分别是
1. 1,2,3,4,5,6,7,8,9,10(共10个方块)
2. 1,2,3,4,6,5,7,8,9,10
我们可以运行到6VS5的时候判断2方块不同,呵呵
是不是问题解决了?期待更好的算法 (过2天我会发布这个算法的程序)