魔方吧·中文魔方俱乐部

 找回密码
 注册
搜索
热搜: 魔方
查看: 1428990|回复: 10
打印 上一主题 下一主题

分珍珠 [复制链接]

Rank: 8Rank: 8

积分
4787
帖子
1876
精华
12
UID
93
性别

魔方理论探索者 十年元老

1#
发表于 2004-8-20 08:57:09 |显示全部楼层


“分珍珠”游戏就是著名的“火柴棍”游戏,我这里有一个
“火柴棍”的拓展的游戏,名曰《智娶华山》,难度较“火柴棍”
游戏大些,但原理一样!
楼主所提的“分珍珠”游戏,可以试用我改编的《追山妹》
游戏代替。《追山妹》游戏与“分珍珠”游戏的不同点为:
1.任意行,每行任意个“山洞”;
2.轮谁堵住最后一个山洞,谁“”,即(追)到了(山妹)。

《智娶华山》 Kvmme5Es.rar (37.87 KB, 下载次数: 169)



注明:因《智娶华山》与《追山妹》是用十年前的机器编程,
故《智娶华山》游戏程序中的声音有些不正常,望玩家谅解!!


[此贴子已经被作者于2005-11-25 9:22:26编辑过]

VfYWixZ6.rar

45.63 KB, 下载次数: 124

~~ 宇宙在旋转运动 ~~ 魔方在循环变换 ~~

使用道具 举报

Rank: 8Rank: 8

积分
4787
帖子
1876
精华
12
UID
93
性别

魔方理论探索者 十年元老

2#
发表于 2005-1-21 09:00:52 |显示全部楼层

/* 《智娶华山》是用 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(); }

~~ 宇宙在旋转运动 ~~ 魔方在循环变换 ~~

使用道具 举报

Rank: 8Rank: 8

积分
4787
帖子
1876
精华
12
UID
93
性别

魔方理论探索者 十年元老

3#
发表于 2005-11-25 09:31:44 |显示全部楼层

加精了。

~~ 宇宙在旋转运动 ~~ 魔方在循环变换 ~~

使用道具 举报

Rank: 8Rank: 8

积分
4787
帖子
1876
精华
12
UID
93
性别

魔方理论探索者 十年元老

4#
发表于 2005-12-12 20:29:12 |显示全部楼层


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 ,则先走方输,否则先走方赢。

~~ 宇宙在旋转运动 ~~ 魔方在循环变换 ~~

使用道具 举报

Rank: 8Rank: 8

积分
4787
帖子
1876
精华
12
UID
93
性别

魔方理论探索者 十年元老

5#
发表于 2005-12-12 20:30:43 |显示全部楼层


下面举例说明特征值的计算方法:
每一行都可以计算出一个非负整数的特征值。举例,对于不长于 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 的特征值。

~~ 宇宙在旋转运动 ~~ 魔方在循环变换 ~~

使用道具 举报

Rank: 8Rank: 8

积分
4787
帖子
1876
精华
12
UID
93
性别

魔方理论探索者 十年元老

6#
发表于 2005-12-13 18:54:40 |显示全部楼层


这个问题可以参考 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编辑过]

~~ 宇宙在旋转运动 ~~ 魔方在循环变换 ~~

使用道具 举报

Rank: 8Rank: 8

积分
4787
帖子
1876
精华
12
UID
93
性别

魔方理论探索者 十年元老

7#
发表于 2005-12-14 19:16:55 |显示全部楼层
同样《智娶华山》的每个单行都可以计算出一个特征值,对于连续的
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 ,则先走方输,否则先走方赢。

~~ 宇宙在旋转运动 ~~ 魔方在循环变换 ~~

使用道具 举报

Rank: 8Rank: 8

积分
4787
帖子
1876
精华
12
UID
93
性别

魔方理论探索者 十年元老

8#
发表于 2005-12-15 19:00:19 |显示全部楼层


《智娶华山》(“中”、“高”)级的含义是为了让玩家(“同”、“不同”)
于计算机的堵洞方式来堵洞!它只是为增加打关难度而特地设计的,是不能让玩家
任选石头的!当 所有横向相连山洞都小于4个,就是每个相连山洞都为 1 、2、3 时,
你就可以直接获胜娶走“华山”。(这些在游戏启动时的帮助信息里已经详细说明)

对于同一关,有不同的玩法,如下面几关的取胜方法都有两种:

*
**
***
****
取胜方法:
0 *
** **
*** 或 ***
**** *00*


又如:
*
**
***
******
取胜方法:
* *
** **
*0* 或 ***
****** **00**


再如:
*
**
***
*******
取胜方法:
* *
00 **
*** 或 ***
******* ***0***

等等等,在此就不一一例举了。

(“中”、“高”)级玩法的原理就是如此,如果只有一种玩法,程序会自动
变通的,以确保使您能够取胜的“石头”方式的,您不必为此操心。

~~ 宇宙在旋转运动 ~~ 魔方在循环变换 ~~

使用道具 举报

Rank: 8Rank: 8

积分
4787
帖子
1876
精华
12
UID
93
性别

魔方理论探索者 十年元老

9#
发表于 2005-12-15 19:01:51 |显示全部楼层
以下是引用simpley在2005-12-15 12:23:37的发言:

另外我想请教下程序中的算法,您是直接把每个特征值都事先计算好放入程序中呢(这样似乎程序好写一点),还是让程序在运行中自己去计算呢(这样好象更有挑战性,因为按您说的算法,不能直接用数学方法一步到位算出特征值)?



我是采取直接把每个特征值都事先计算好放入程序中的。

当然可以让程序在运行中自己去计算。(比如 20 楼的方法)

并且我的算法是可以直接用数学方法一步到位算出特征值的,比如按照 22 楼
的计算方法,便可以事先简单计算出 1 ~ n 的所有特征值。

~~ 宇宙在旋转运动 ~~ 魔方在循环变换 ~~

使用道具 举报

Rank: 8Rank: 8

积分
4787
帖子
1876
精华
12
UID
93
性别

魔方理论探索者 十年元老

10#
发表于 2005-12-17 12:06:22 |显示全部楼层

欢迎大家来玩《分珍珠》、《追山妹》、《智娶华山》等游戏。
~~ 宇宙在旋转运动 ~~ 魔方在循环变换 ~~

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

Archiver|手机版|魔方吧·中文魔方俱乐部

GMT+8, 2024-5-8 05:06

Powered by Discuz! X2

© 2001-2011 Comsenz Inc.

回顶部