华容道解法(1)——横刀立马首先规定一下棋子的名称:
最大的“曹”,横着放的“关”,竖着放的“飞”,最小的“兵”。
横刀立马 81步
兵左1格,飞下,关右,兵下,飞右,兵上1,兵左,飞下,关左,兵上折右,兵上,飞右,兵右折下,关下,二兵左,二飞上,二兵右,关下,兵下折左,二飞左,飞下,曹右,
飞右,二兵上,飞左,飞下,曹左,
飞上,飞右,兵上,兵左折上,关右,二飞下,兵左,曹下,
兵右,兵上折右,兵上,飞上,飞左,兵左折下,曹下,
兵下折左,飞左,飞上,曹右,
兵下1,上兵下1,兵右,二飞上,兵左,兵下,曹左,
飞下,飞右,二兵右,飞右,飞上,曹左,
二兵下,飞左,飞上,兵右折上,关上,二兵右,曹下,
二兵左,关上,兵上折右,曹右!
华容道解法(2)——层层设防
层层设防 102步
关左、兵下折左、兵下、飞下、曹右、
飞右、二兵上、二关左、飞左、兵上、兵右折上、关右、二关下、兵下折右、兵下、飞左、曹左、
二兵上、飞右、关右、兵下、兵左、关上、兵右、关上、关左、飞下、兵下、二关右、兵右、飞下、曹左、
兵左折上、关上、飞上、二兵右、关右、飞下、曹下、
二兵左、关上、兵上折右、曹右、
兵下、兵左折下、关左、兵上折左、飞上、兵上、二关右、飞右、二兵下、曹左、
兵左、兵下、飞下、关右、曹上、
二兵上、飞上、关左、关下、飞下、兵右、兵上、飞右、兵右折下、曹下、
关左、二兵上、二飞上、关上、关右、二兵下、曹下、
关下、二兵左、二飞上、二关上、二兵右、曹下、
关左、兵上折右、曹右!数字华容道,是在4x4的格子中,依次从左到右,从上到下放置1-15这15个数字。经过一定的随机,必须将这15个数字复原。每个数字只能向相邻的唯一空格移动。难度更高的,格子和数字会更多,比如5x5。
我在开发一个类数字华容道游戏时,发现自己3x3的格子,居然怎么都解不出来。比如:一排1、2、3,二排4、5、6,三排8,7。经过网上查询,才知道完全随机位置的数值华容道仅有50%的概率是有解的。而我就是用的完全随机方式去打乱次序。
网上有两篇文章说的很好,以下是根据这两篇文章的总结。
首先,要弄清楚一个概念:逆序数。逆序数,即一个数字序列,将其中所有数字依次两两对比,若大数在前,小数在后,那么这就是一对逆序数。这里说到的逆序数,指的是数字序列中逆序数的数量。比如:上文提到的1、2、3、4、5、6、8、7,逆序数只有1个,即8和7。
另外,还有一点要提出来。一般来讲,复原状态(初始状态)的数字华容道,会有一个空格,一般会设置在最末行的右下角。但也可以根据实际的需求,设置在其他行。请留意,初始空格所在的行数,是决定是否有解的一个重要因素。
数字华容道,必然有解,只存在于如下3个细分情形:
实际的推演涉及到我一时难以彻底理解的数学推算,我只能用浅显的方式来理解这个问题。
首先,有解的前提在于:当前空格回到初始空格所在行数时,逆序数一定得是偶数!为什么,我不清楚。
要想把空格移动到初始空格所在行,必须进行若干次上下移动和若干次左右移动。
左右移动,不会改变逆序数;上下移动,若格子列数为奇数,则每次增减偶数个逆序数,若格子列数为偶数,则每次增减奇数个逆序数。
也就是说:
具体实现应该很简单,不多说了,就说一点。如果想更改一个数字序列的逆序数的奇偶性,只需要调换一对逆序数的位置即可。
可能是CS106A课程上的一句话,并不是原文:
不理解没关系,会用就行。
参考文档:数字华容道的基本解法思路就如同魔方解法-样,下面开始教学步骤,先对第一排,将1、2、3一个个移到目标位置,这一步不需要什么技巧,只管将三个数字-个一个移就行,其它数字不用管。
在移数字4时先移到目标位下面, 将4同排左边的两个数字往右移-格,再将第一排的1、2、3三个数字整体逆时针往左退一格,这时就可以把4移到右上角目标位,移好后将4左边的无关数字移走,把1、2、3整体顺时针往右回倒一格,这样第一排就对好了。第二排与第一排同。
接下来是第三排解法,如果10在9的下面,而不是右边时需要用到一种解法,这种情况需要把10藏到右边的四方格中,让9可以在左边的四方格自由移动,这时就可以把9移到10的左边。这一步只看9和10,其它数字不用管。9和10对好后就可以对11, 12。
如果出现10、11在同- 个四方格内且11、在10的下面,解法同上,可以先将9、10- -起逆时针左移-格,将11移到右边四方格的左上位。这样就可以对好第三排。
将对好的9、10、 11、 12全部沿逆时针往左退两格,13、14、 15逆时针往右移两格, 这时发现13、14、15在右边同一一个四方格内 ,只要把13移到9的右边那一格顺序就对了。再把9到15按顺时针移两格就完全对好了。
数字华容道最快解决口诀:一横四竖、二横三竖、三横两竖、四横一竖、五横零竖,二横三竖和三横四竖相对较难。
第一排,将1、2、3一个个移到目标位置,其它数字不用管。在移数字4时先移到目标位下面,这时发现4没办法下移到目标位,可以将4同排左边的两个数字往右移一格。
再将第一排的1、2、3三个数字整体逆时针往左退一格,这时就可以把4移到右上角目标位了,移好后将4左边的无关数字移走,把1、2、3整体顺时针往右回倒一格,第一排就对好了。第二排解法和第一排一样。
第三排,如果10在9的下面,需要把10藏到右边的四方格中,然后让9可以在左边的四方格自由移动,这时就可以把9移到10的左边。这一步只看9和10,其它数字不用管。对11,12,如果10、11在同一个四方格里,且11在10的下面,解法同上,可以先将9、10逆时针左移一格,将11移到右边四方格的左上位。这样第三排就对好了。
最后一排,将对好的9、10、11、12全部逆时针往左退两格,13、14、15逆时针往右移两格,这时13、14、15在右边同一个四方格内,只要把13移到9的右边那一格顺序就对了。再把9到15按顺时针移两格就全部对好了。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)