规则:一共三行珍珠,每次你可以取走其中一行的任意颗珍珠,取完后点击“go”,最后一颗珍珠被谁拿到谁就输了!
以下是地址
http://flash.qianlong.com/409/2003-8-13/6@443298.htm
说难其实很简单说简单又挺难的
大家试试吧
[em01][em01][em01]
“分珍珠”游戏就是著名的“火柴棍”游戏,我这里有一个
“火柴棍”的拓展的游戏,名曰《智娶华山》,难度较“火柴棍”
游戏大些,但原理一样!
楼主所提的“分珍珠”游戏,可以试用我改编的《追山妹》
游戏代替。《追山妹》游戏与“分珍珠”游戏的不同点为:
1.任意行,每行任意个“山洞”;
2.轮谁堵住最后一个山洞,谁“赢”,即(追)到了(山妹)。
《智娶华山》
注明:因《智娶华山》与《追山妹》是用十年前的机器编程,
故《智娶华山》游戏程序中的声音有些不正常,望玩家谅解!!
[此贴子已经被作者于2005-11-25 9:22:26编辑过]
/* 《智娶华山》是用 Turbo C 写的 */ /* 下面是它的音乐程序 */ /* 你可以把它复制到 Turbo C 中运行 */
int play[]={523,659,587,659,587,659,494,587,523,440,440,440,330,392,440,494,494,330,415,494,523,523,523};
music() { int musiclong,j; long stop;
musiclong=0; for (j=0;j<230;j++) { musiclong++; if (musiclong>22) musiclong=0; sound(play[musiclong]); stop=clock(); do{ }while (abs(clock()-stop)<3); nosound(); }
}
main() { music(); }
┌┬┬士将┬┬┬┐ ├┼炮┼士兵┼┼┤ ├┼┼┼炮┼┼┼┤ 卒┼┼┼┼┼┼┼┤ ├┴┴┴┴┴┴┴┤ ├┬┬┬┬┬┬┬┤ 兵┼┼┼┼┼┼┼┤ ├┼┼┼炮┼┼┼┤ ├┼炮┼仕卒┼┼┤ └┴┴仕帅┴┴┴┘
很同意hw294的意见.
刚好这个棋局我也走过,很有异曲同工之妙.
我看可以在{数学、算术趣题}中发些象棋的题目让大家做做呀!!!
[此贴子已经被作者于2005-9-4 10:01:18编辑过]
ggglgq先生:
您的<智取华山>游戏我怎么也通不过(只能玩到第5级),能不能请您讲一下详细的算法.谢谢.
simpley 先生的确很强!如果不知道《智娶华山》算法的奥妙,能
玩到第 5 级已经相当不错了。
如果您玩楼主的游戏(或者本人的“追山妹”游戏)没问题的话,您
应该知道她们的算法是“把每一行的特征值用“逻辑异或”加起来,如果
是 0 ,则先走方输,否则先走方赢。”
(注意:楼主的游戏要留意 1 1 1 、 1 1 及 1 的特殊情形。)
同样《智娶华山》的每个单行都可以计算出一个特征值,对于连续的
n 个洞来说,她们的特征值分别是:
0: 0
1: 1
2: 2
3: 3
4: 1
5: 4
6: 3
7: 2
8: 1
9: 4
10:2
11:6
12:4
13:1
14:2
15:7
16:1
17:4
18:3
19:2
20:1
21:4
22:6
......
胜负的判断标准同样是:把每一行的特征值用“逻辑异或”加起来,
如果是 0 ,则先走方输,否则先走方赢。
下面举例说明特征值的计算方法:
每一行都可以计算出一个非负整数的特征值。举例,对于不长于 6 个
的行来说:(表示方法: * 代表一个洞, 0 代表已经被填上的洞。 )
000000 0 000
*00000 1 001
0*0000 1 001
**0000 2 010
00*000 1 001
*0*000 0 000
0**000 2 010
***000 3 011
000*00 1 001
*00*00 0 000
0*0*00 0 000
**0*00 3 011
00**00 2 010
*0**00 3 011
0***00 3 011
****00 1 001
0000*0 1 001
*000*0 0 000
0*00*0 0 000
**00*0 3 011
00*0*0 0 000
*0*0*0 1 001
0**0*0 3 011
***0*0 2 010
000**0 2 010
*00**0 3 011
0*0**0 3 011
**0**0 0 000
00***0 3 011
*0***0 2 010
0****0 1 001
*****0 4 100
00000* 1 001
*0000* 0 000
0*000* 0 000
**000* 3 011
00*00* 0 000
*0*00* 1 001
0**00* 3 011
***00* 2 010
000*0* 0 000
*00*0* 1 001
0*0*0* 1 001
**0*0* 2 010
00**0* 3 011
*0**0* 2 010
0***0* 2 010
****0* 0 000
0000** 2 010
*000** 3 011
0*00** 3 011
**00** 0 000
00*0** 3 011
*0*0** 2 010
0**0** 0 000
***0** 1 001
000*** 3 011
*00*** 2 010
0*0*** 2 010
**0*** 1 001
00**** 1 001
*0**** 0 000
0***** 4 100
****** 3 011
这里,第一列是行的状态,第二列是特征值的十进制表示,第三列是
特征值的二进制表示。
整个游戏的特征值是每一行的特征值的逻辑异或的和。若其为 0,则
先走方输,反之则先走方胜。取胜的方法就是选择一种走法,使得走完后
的特征值为 0。这种走法是必然存在的。
法则一:如果一行被 0 分隔为若干个连续 * 号段,则该行的特征值是
这些 * 号子段的特征值的逻辑异或之和。例如,*0**0* 这个串,被 0 分隔
为三个子串:*,**,*,它们的特征值分别为 1,2,1,因此整个串的特征值
是 1^2^1 = 2。
法则二:连续 * 号的特征值计算方法。 列出按照游戏方法对这行进行
操作后所有可能的情况,这些操作后形成的串成为后继串。对每一个后继串
计算特征值,这些特征值形成了一个集合,不在这个集合中的最小非负整数
就是要求的特征值。 例如,** 这个串,可以按照游戏规则形成 *0,0*,00
三个后继串,他们的特征值分别为 1,1,0,因此不在这个集合中的非负的
最小整数是 2,就是 ** 的特征值。
由 法则一 和 法则二 可以计算出 0 ~ n 的特征值。
这个问题可以参考 20 楼,由 法则一 和 法则二 来求解 5 的
特征值。
对于不长于 5 个的行来说,简单举例:
***00 3 011
****0 1 001
***0* 2 010
**00* 3 011
**0** 0 000
(表示方法: * 代表一个洞, 0 代表已经被填上的洞。这里仅举
个别几种特例,其它情况均等价以上几种情况。其中蓝色特征值为 1 )
这里,第一列是行的状态,第二列是特征值的十进制表示,第三列
是特征值的二进制表示。
不在这个集合中的非负的最小整数是 4 ,因此它就是 ***** 的
特征值,即洞数为 5 的 特征值 是 4 ,而非 1、2、3。
同理,对于 20 楼,可以求解出洞数为 6 的特征值是 3 ,等等。
[此贴子已经被作者于2005-12-14 17:58:08编辑过]
0: 0
1: 1
2: 2
3: 3
4: 1
5: 4
6: 3
7: 2
8: 1
9: 4
10:2
11:6
12:4
13:1
14:2
15:7
16:1
17:4
18:3
19:2
20:1
21:4
22:6
......
胜负的判断标准同样是:把每一行的特征值用“逻辑异或”加起来,
如果是 0 ,则先走方输,否则先走方赢。
明白了.谢谢.
不过上面的方法只适用于初级的吧,对中级和高级好象没有一个万全之策.电脑只有在"让"你的情况下才能取胜.比如:
3,3,1,1,1
这时该我填洞了,我填了单独的一个洞,剩下了:
3,3,1,1
下面电脑只须在3个洞中填上两个,剩下:
1,3,1,1
这样我就输定了.但电脑却停止了,直接判我胜.让人有胜之不武的遗憾.也就是说,在特征值不为0的情况下,无论各数是几,在初级模式下,你总能胜(这一点我已可以证明).但在中高级模式下,却不一定.
另外我想请教下程序中的算法,您是直接把每个特征值都事先计算好放入程序中呢(这样似乎程序好写一点),还是让程序在运行中自己去计算呢(这样好象更有挑战性,因为按您说的算法,不能直接用数学方法一步到位算出特征值)?
[此贴子已经被作者于2005-12-15 13:47:19编辑过]
《智娶华山》(“中”、“高”)级的含义是为了让玩家(“同”、“不同”)
于计算机的堵洞方式来堵洞!它只是为增加打关难度而特地设计的,是不能让玩家
任选石头的!当 所有横向相连山洞都小于4个,就是每个相连山洞都为 1 、2、3 时,
你就可以直接获胜娶走“华山”。(这些在游戏启动时的帮助信息里已经详细说明)
对于同一关,有不同的玩法,如下面几关的取胜方法都有两种:
*
**
***
****
取胜方法:
0 *
** **
*** 或 ***
**** *00*
又如:
*
**
***
******
取胜方法:
* *
** **
*0* 或 ***
****** **00**
再如:
*
**
***
*******
取胜方法:
* *
00 **
*** 或 ***
******* ***0***
等等等,在此就不一一例举了。
(“中”、“高”)级玩法的原理就是如此,如果只有一种玩法,程序会自动
变通的,以确保使您能够取胜的“石头”方式的,您不必为此操心。
另外我想请教下程序中的算法,您是直接把每个特征值都事先计算好放入程序中呢(这样似乎程序好写一点),还是让程序在运行中自己去计算呢(这样好象更有挑战性,因为按您说的算法,不能直接用数学方法一步到位算出特征值)?
我是采取直接把每个特征值都事先计算好放入程序中的。
当然可以让程序在运行中自己去计算。(比如 20 楼的方法)
并且我的算法是可以直接用数学方法一步到位算出特征值的,比如按照 22 楼
的计算方法,便可以事先简单计算出 1 ~ n 的所有特征值。
明白中高级的意思了,谢谢您的解答.
另外我说的用数学方法一步到位算出特征值的意思,指的是不能用f(n)这样的函数形式来计算,比如,要算出5的特征值,就必须在算出4的特征值的前提下来计算,而不可能直接代入用f(5)算出来.
欢迎光临 魔方吧·中文魔方俱乐部 (http://bbs.mf8-china.com/) | Powered by Discuz! X2 |