无心人
发表于 2008-7-2 10:40:17
:b:
看的比一头雾水还雾水
这就是C/C++的好处哦
mathe
发表于 2008-7-2 10:42:00
原帖由 gxqcn 于 2008-7-2 10:36 发表 http://bbs.emath.ac.cn/images/common/back.gif
可否用文字具体叙述之后的出牌策略?:Q:
现在只有计算机使用的策略,不知道能否有简单的规律.
有一种方法,可以将程序所有结果为SUCC的状态输出来看看是否有规律。(可以只输出先手和后手牌的数目相等或先手比后手多一张牌两类)
无心人
发表于 2008-7-2 10:44:04
:handshake
就是说,没有开局策略
只有具体的一个个局面的排列
mathe
发表于 2008-7-2 10:45:27
原帖由 无心人 于 2008-7-2 10:40 发表 http://bbs.emath.ac.cn/images/common/back.gif
:b:
看的比一头雾水还雾水
这就是C/C++的好处哦
这个同语言关系不大,同使用的注释,代码风格,使用算法的复杂度,还有阅读者对语言的熟悉程度都有关系:lol
无心人
发表于 2008-7-2 10:52:34
呵呵
确实
至今我对C/C++都只能说入门
我起步的语言是Pascal
在尝试看懂C之前经历了三年
连函数都弄不懂
而那时已能明白汇编了
mathe
发表于 2008-7-2 11:04:55
我在学习C/C++之前也学过BASIC,FORTRAN,8086汇编,Pascal
不过现在其他都忘得差不多了,只有C/C++由于经常使用,越来越熟悉了
无心人
发表于 2008-7-2 11:14:40
C/C++的逻辑是
语法的字符简单,字符!!
贴近硬件,所以灵活多变
很佩服近40年的老语言还这么健壮
风云剑
发表于 2008-7-2 12:58:22
原帖由 mathe 于 2008-7-2 09:31 发表 http://bbs.emath.ac.cn/images/common/back.gif
有简单的方法吗?计算机说只要先手先出3,4,5或6都可以赢
程序不对吧,我把你的程序里50改成7,怎么还是先手必胜?明显是必败的啊。我写了个程序,直接递归搜索,结果50也是必败的,而且随着数字的增大,先手获胜的机会越来越小。
chriswang
发表于 2008-7-2 13:00:55
感觉程序确实有些问题
mathe
发表于 2008-7-2 14:00:01
的确题目是先手负,忘记了每次产生下一个状态要交换两个人状态,所以产生状态顺序不再单调了,所以不能顺序产生,修改一下代码:
#include <stdio.h>
#define LIMIT (1<<24)
int states;
#define FAIL -1
#define SUCC -2
#define R 50
void gen(int left);
int get_state(int x){
if(states==0){
gen(x);
}
return states;
}
void gen(int left){
int first_u=left&((1<<12)-1);
int second_u=left>>12;
int cfirst,csecond;
int i,sum;
cfirst=csecond=0,sum=0;
for(i=0;i<6;i++){
int c1=(first_u>>(2*i))&3;
int c2=(second_u>>(2*i))&3;
cfirst+=c1;
csecond+=c2;
sum+=(c1+c2)*(i+1);
}
if(cfirst!=csecond&&cfirst-1!=csecond)
return;
sum=126-sum;
if(sum>R){
states=FAIL;
}else if(sum==R){
states=SUCC;
}else{
int s,j;
for(i=0;i<6;i++){
s=(first_u>>(2*i))&3;
}
for(i=0;i<6;i++){
int new_u=first_u;
int reach;
if(s>0){
new_u-=1<<(2*i);
reach=second_u|(new_u<<12);
if(get_state(reach)==SUCC)
break;
}
}
if(i<6){
states=FAIL;
}else{
states=SUCC;
}
}
}
void output_states(int x);
int next_state(int x)
{
int first_u=x&((1<<12)-1);
int second_u=x>>12;
int i,s;
for(i=0;i<6;i++){
s=(first_u>>(2*i))&3;
}
int reach=-1;
for(i=0;i<6;i++){
int new_u=first_u;
if(s>0){
new_u-=1<<(2*i);
reach=second_u|(new_u<<12);
if(states==SUCC){
output_states(reach);
}
}
}
return reach;
}
void output_states(int x)
{
printf("State %06x:",x);
if(states==SUCC){
printf("F");
}else{
printf("S");
}
printf("\n");
}
int main()
{
int i;
gen(LIMIT-1);
output_states(LIMIT-1);
printf("next states:\n");
next_state(LIMIT-1);
return 0;
}