200分求购:如何编程实现将魔方的六个面转成每个面各一种颜色?(200分)

  • 主题发起人 主题发起人 梦星魂
  • 开始时间 开始时间

梦星魂

Unregistered / Unconfirmed
GUEST, unregistred user!
遇到这样一个问题:要实现将魔方的六个面转成每个面各一种颜色。
假设建立一个三维数组
Type
b:1..6;{表示六种颜色}
a:array[1..6,1..9,1..9] of b;
要考虑到旋转,如何确定循环的最终情况?
 
我觉得你应该重新定义一下数组,魔方共有24块组成。
其中有8块是有3个面向外的,12块是2个面向外的,还有6块是固定的只有一面向外的。
 
jiyongbin
这样做,如何确定每一个点?如果我以每个点的旋转都做判断的话?好象递归的次数会很大?
 
能具体点吗
我也想知道
 
看来你是想穷举出来结果,天知道有多大。
我觉得完全可以套用固定的模式。
 
魔方的算法网上应该有很多的,你去搜索一把;
这是天极网的一篇文章,你可以看看,想想思路:
  一、概念
  面(face) --魔方有6个面,分别标为(u,v,w,x,y,z),其中(u,v,w)分别是(x,y,z)的反方向。
  状态(status) --魔方的所有可能的不同色块排列。一般的表示为S
  初始状态(S[0]) --魔方6面各自同色的状态。
  动作(action) --迎着每一个面有左转90度(left),转180度(opsite),右转90度(right)等
3种操作,共18种基本动作。分别标为:
  (ul, uo, ur, vl, vo, vr, wl, wo, wr, xl, xo, xr, yl, yo, yr, zl, zo, zr) 先执行动作A,
再执行动作B,称为复合动作,简称动作。记为:A*B
  二、算法
  一个状态集S,为每个元素配一个深度指标。
  1、加入初始状态S[0],深度为0。
  2、对S中每个新加入的元素,执行18个基本动作。
  3、对每个动作的结果,如果不在S之中,则加入S之中,深度为被操作对象的深度加1。
  4、反复执行2到3,直到S不再增长为止。
  对于魔方的一个状态S,查找上述状态表得到深度d。执行18个基本动作,一定至少
有一个动作的结果深度为d-1,确认该动作为一步。反复尝试和确认,一定能够到达初始状态
S[0]。
  状态集S中元素个数的估计:六个面的中心点不因动作而变化,8个顶点与12 个棱,应当
有8!*12!约50M个状态。虽然顶点和棱在位置上还有自由度,但是顶点和棱之间也有相互的约束
关系。我不能定量地计算各自的程度,但是我觉得PC 机的计算能力应当可以对付,至少值得一试。
  三、置换与等价
  置换--魔方的空间摆放方式有24种。每种方式对应唯一一种面之间的置换。由于(u,v,w)总是
(x,y,z)的反方向,所以只要确定(x,y,z)的置换即可。以某一面着地时第一象限的三个轴标记为:
(yzx, zvx, vwx, wyx, // u面着地
zxy, xwy, wuy, uzy, // v面着地
xyz, yuz, uvz, vxz, // w面着地
zyu, ywu, wvu, vzu, // x面着地
xzv, zuv, uwv, wxv, // y面着地
yxw, xvw, vuw, uyw) // z面着地
所有置换构成置换群。其中L[xyz]为1元。
  状态的等价关系--对于魔方的两个状态S与T,如果存在一个置换L,使得S*L = T 则称S与T等价。
  动作的相似关系--对于魔方的两个动作A与B,如果存在一个置换L,使得S[0]*A = S[0]*L*B 则称
A与B相似。
  四、算法的优化
  一个状态集S,为每个元素配一个深度指标。
  1、加入初始状态S[0],深度为0。
  2、对S中每个新加入的元素,执行18个基本动作。
  3、对每个动作的结果,如果不与S中任何元素等价,则加入S之中,深度为被操作对象的深度加1。
  4、反复执行2到3,直到S不再增长为止。
  对于魔方的一个状态S,查找上述状态表中与之等价的状态,得到深度d。
  执行18个基本动作,一定至少有一个动作的结果,其等价状态的深度为d-1,确认该动作为一步。反复
尝试和确认,一定能够到达初始状态S[0]。
  引入置换和等价关系,实际上是以时间换空间。因为这个算法的主要问题是空间开销太大,所以这种
平衡是值得的。
  五、算法的实现
  我还没有真正动手做,仅仅提供一点建议吧。
  1、可以用0,1,2,3,4,5表示6种颜色。6个32位整数表示一个状态。每个整数表示一个面。整数中每三位
表示一个色块。
  2、用32位整数表示深度应当足够了。
  3、调试时可以先选择三个基本动作,通过后再选择六个基本动作,这样一步步扩大。
  六、其他
  各种智能算法的评价函数可不可以用对状态表的统计分析的方法得到?
 
关于“图像旋转”,有专家如下说法:
*************************************
如果有人试着通先选择新的中心点再旋转图片这个方法来得到新的图片的话,会发觉图片
上有许多“洞”,这是因为不连续的空间和整数的数学运算造成的。为了解决这个问题,
我们可以使用一个“相反”的方法。仔细考虑新图像中的每个像素,查找它在原图像中的
位置。这样的技术就会解决任何在图像中的“洞”。
*************************************
我个人观点:
通用的算法原理都一样,及选择旋转后的图像的点,通过算法查找气再原图中对应的香素点!
我觉得旋转后的图像有效区域的象素点数和原图片的象素点数一样多,怎么会出现“洞”呢?
我不理解上面这段话的含义,哪位仁兄理解了帮忙解释一下
 
实际上,魔方有27个点,而中间的一个点是固定不动的
其他点的旋转也是有规律的。6各面的旋转有3中情况,-90,90,180,所以总共有18种
情况,仔细想想也差不多了,
91年全国比赛的时候有个题目和这个差不多。
 
手工把魔方玩出来,谁有最简单最智能的的算法?哈哈.
曾经有算法高人教会我们5分钟内搞定.
 
手工的话我的记录是1分46秒,不过运气比较好,
一般来说可以在3分钟左右搞出来,其实到最后都是公式一样的,没有什么意思了。
 
嘻嘻,玩魔方么,我最熟练的时候全部在2分钟之内的,我玩坏过三个魔方,
各种花样都研究过,但是让我编程我就什么都不是了。
 
后退
顶部