假设A为先手,B为后手
n = 1 先手必胜,显然
n = 3 先手必胜,显然
n = 5 先手必败,转化方法:(1)若先手取1,后手取3;(2)若先手取2,则转化为B为先手,n=3;(3)先手取3,后手取1
n = 7 先手必胜,先手取2,则转化为B为先手n=5,A必胜
n = 9 先手必败,先手去x,后手取4-x,转化为A为先手,n=5,A必败
...
得出结论n=3 || n = 4*k+1 (k>=0)先手必胜
n = 4*k+3 (k>1)先手必败
楼主困扰你四年的问题终于解决了吧,你这个从不结贴的家伙,败人品,鄙视
[Quote=引用 71 楼 hl_md_wj 的回复:]
余数 持单 持双
0 F W
1 W W
2 W W
3 W W
4 W F
..............................
这个表的意义如下,第一列表示现在还有多少宝石没有取走,第二列表示在这种状态下,如果先取者手中是单数的情况,第三列表示先取者手中是双数的情况(W表示赢,F表示输),前三行比较好理解,我主要从第四行开始解释我的方法
第四行,如……
[/Quote]
int _tmain(int argc, _TCHAR* argv[])
{
int i;
char p[66][2] ;
p[0][0] = 'F', p[0][1] = 'W';
p[1][0] = 'W', p[1][1] = 'W';
p[2][0] = 'F', p[2][1] = 'W';
for(i = 3; i < 66; i++)
{
if(i % 2 != 0 )
{
if(p[i-1][0] == 'F' || p[i-2][0] == 'F' || p[i-3][0] == 'F')
p[i][0] = 'W';
else
p[i][0] = 'F';
if(p[i-1][1] == 'F' || p[i-2][1] == 'F' || p[i-3][1] == 'F')
p[i][1] = 'W';
else
p[i][1] = 'F';
}
else
{
if(p[i-1][1] == 'F' || p[i-2][1] == 'F' || p[i-3][1] == 'F')
p[i][0] = 'W';
else
p[i][0] = 'F';
if(p[i-1][0] == 'F' || p[i-2][0] == 'F' || p[i-3][0] == 'F')
p[i][1] = 'W';
else
p[i][1] = 'F';
}
}
printf("余数 持单 持双\n");
for(i = 0; i < 66; i++)
printf("%4d %4c %4c\n",i,p[i][0],p[i][1]);
return 0;
}
余数 持单 持双
0 F W
1 W W
2 F W
3 W F
4 W W
5 W W
6 W F
7 F W
8 W W
9 W W
10 F W
11 W F
12 W W
13 W W
14 W F
15 F W
16 W W
17 W W
18 F W
19 W F
20 W W
21 W W
22 W F
23 F W
24 W W
25 W W
26 F W
27 W F
28 W W
29 W W
30 W F
31 F W
32 W W
33 W W
34 F W
35 W F
36 W W
37 W W
38 W F
39 F W
40 W W
41 W W
42 F W
43 W F
44 W W
45 W W
46 W F
47 F W
48 W W
49 W W
50 F W
51 W F
52 W W
53 W W
54 W F
55 F W
56 W W
57 W W
58 F W
59 W F
60 W W
61 W W
62 W F
63 F W
64 W W
65 W W
上次写错了一个数,这次修正,先手必胜,因为先手持双开始(0),只要拿走3个,后手方必持双从62个开始取,上表中可以看出他是必败的,这次应该是对的了
[Quote=引用 71 楼 hl_md_wj 的回复:]
余数 持单 持双
0 F W
1 W F
2 W W
3 W W
4 W F
..............................
这个表的意义如下,第一列表示现在还有多少宝石没有取走,第二列表示在这种状态下,如果先取者手中是单数的情况,第三列表示先取者手中是双数的情况(W表示赢,F表示输),前三行比较好理解,我主要从第四行开始解释我的方法
第四行,如……
[/Quote]
我根据我回复的方法写了个程序,下面是程序和运行结果
int _tmain(int argc, _TCHAR* argv[])
{
int i;
char p[66][2] ;
p[0][0] = 'F', p[0][1] = 'W';
p[1][0] = 'W', p[1][1] = 'F';
p[2][0] = 'W', p[2][1] = 'W';
for(i = 3; i < 66; i++)
{
if(i % 2 != 0 )
{
if(p[i-1][0] == 'F' || p[i-2][0] == 'F' || p[i-3][0] == 'F')
p[i][0] = 'W';
else
p[i][0] = 'F';
if(p[i-1][1] == 'F' || p[i-2][1] == 'F' || p[i-3][1] == 'F')
p[i][1] = 'W';
else
p[i][1] = 'F';
}
else
{
if(p[i-1][1] == 'F' || p[i-2][1] == 'F' || p[i-3][1] == 'F')
p[i][0] = 'W';
else
p[i][0] = 'F';
if(p[i-1][0] == 'F' || p[i-2][0] == 'F' || p[i-3][0] == 'F')
p[i][1] = 'W';
else
p[i][1] = 'F';
}
}
printf("余数 持单 持双\n");
for(i = 0; i < 66; i++)
printf("%4d %4c %4c\n",i,p[i][0],p[i][1]);
return 0;
}
余数 持单 持双
0 F W
1 W F
2 W W
3 W W
4 W F
5 F W
6 W W
7 W W
8 F W
9 W F
10 W W
11 W W
12 W F
13 F W
14 W W
15 W W
16 F W
17 W F
18 W W
19 W W
20 W F
21 F W
22 W W
23 W W
24 F W
25 W F
26 W W
27 W W
28 W F
29 F W
30 W W
31 W W
32 F W
33 W F
34 W W
35 W W
36 W F
37 F W
38 W W
39 W W
40 F W
41 W F
42 W W
43 W W
44 W F
45 F W
46 W W
47 W W
48 F W
49 W F
50 W W
51 W W
52 W F
53 F W
54 W W
55 W W
56 F W
57 W F
58 W W
59 W W
60 W F
61 F W
62 W W
63 W W
64 F W
65 W F
结论,先手必败 请高手看看有没有问题