| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 8688 人关注过本帖, 1 人收藏
标题:【原创】24点游戏程序之一
只看楼主 加入收藏
清风拂晓
Rank: 8Rank: 8
来 自:火星
等 级:蝙蝠侠
威 望:1
帖 子:356
专家分:889
注 册:2010-8-13
收藏
得分:1 
数字流?

清风拂暮(木)
2010-11-11 20:39
张竞
Rank: 1
等 级:新手上路
帖 子:6
专家分:2
注 册:2010-11-11
收藏
得分:1 
看不懂程序的语言
2010-11-13 08:40
tduslost
Rank: 2
等 级:论坛游民
帖 子:19
专家分:26
注 册:2010-11-13
收藏
得分:1 
弄个成品出来才有兴趣看...不然看不下去,
2010-11-13 19:39
shafeilong
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:4
帖 子:236
专家分:1434
注 册:2009-3-21
收藏
得分:1 
能不能注释???
2010-11-13 22:38
abc3210cba
Rank: 2
等 级:论坛游民
帖 子:63
专家分:97
注 册:2010-9-26
收藏
得分:1 
用了遍历有耐心不嫌烦,很不错
2010-11-14 18:26
jay416118
Rank: 2
等 级:论坛游民
帖 子:18
专家分:19
注 册:2010-11-9
收藏
得分:1 
以下是引用御坂美琴在2010-11-11 18:29:15的发言:

不错,但我小学玩这个游戏的时候,还是喜欢把JQK加上当11,12,13,这样变化更丰富,但即使这样,计算速度依然神速(平均1-2秒!但不是说我,我比较菜)
小学都玩这个了,那你该去中科院了
2010-11-14 19:27
yu_hua
Rank: 2
等 级:论坛游民
帖 子:222
专家分:95
注 册:2006-8-10
收藏
得分:0 
/*------------------------------
【原创】24点游戏程序之二
-- 最简短的、仅52行代码

-------------------------------*/
#define  TOP 10  //设定牌的最大点数,可改成其它数字
#include <stdio.h>
#include <math.h>
int quan_pai_lie(int a[],int n)//全排列函数
//从初始时的升序排列到结束前的降序排列
//每调用一次该函数,就给出一个新的排列
{   int i,j,k,temp;
    for(k=n-1;k>0;k--)
     if(a[k-1]<a[k])break;
    if(k==0)return 0;//0:排列已尽
    temp=a[k-1];i=k;
    for(j=k+1;j<n;j++)
     if(temp<a[j]&&a[j]<a[i])i=j;
    a[k-1]=a[i];a[i]=temp;
    for(i=k;i<n-1;i++)
    for(j=k;j<n-1+k-i;j++)
     if(a[j+1]<a[j])
     temp=a[j],a[j]=a[j+1],a[j+1]=temp;
    return 1;//1:排列未尽
}
double op(double x, int opi, double y)//定义5种运算
{   if(opi==1)return x+y;
    if(opi==2)return fabs(x-y);
    if(opi==3)return x*y;      //乘法
    if(opi==4 && y)return x/y; //除法
    if(opi==5 && x)return y/x; //反除
    else return -999999999999; //异常出口
}
int main( void )
{    int i,j,k,L,p[4],op1,op2,op3,noslv=0,total=0;
//    printf("please input 4 numbers(1 - 10): ");
//    scanf("%d %d %d %d",&i,&j,&k,&L);//请从小到大输入之
    printf("无解出牌组如下\n");
    for(i=1;i<=TOP;i++)
    for(j=i;j<=TOP;j++)
    for(k=j;k<=TOP;k++)
    for(L=k;L<=TOP;L++)
    {    total++;
        p[0]=i,p[1]=j,p[2]=k,p[3]=L;
        do{
        for(op3=1;op3<=4;op3++)
        for(op2=1;op2<=4;op2++)
        for(op1=1;op1<=4;op1++)
        if(fabs(24-op(op(p[0],op1,p[1]),op3,op(p[2],op2,p[3])))<1E-8)goto success;
        for(op3=1;op3<=5;op3++)
        for(op2=1;op2<=4;op2++)
        for(op1=1;op1<=4;op1++)
        if(fabs(24-op(op(op(p[0],op1,p[1]),op2,p[2]),op3,p[3]))<1E-8)goto success;
        }while(quan_pai_lie(p,4));//每调用1次给出1个排列
        printf("%d,%d,%d,%d \t(%d)\n",i,j,k,L,++noslv);
        success:;
    }   printf("共有%d种出牌,除%d种无解外,其余都可通过加减乘除得到24。\n",total,noslv);
    return 0;
}
/*运行情况
无解出牌组如下
1,1,1,1         (1)
1,1,1,2         (2)
1,1,1,3         (3)
1,1,1,4         (4)
1,1,1,5         (5)
1,1,1,6         (6)
1,1,1,7         (7)
1,1,1,9         (8)
1,1,1,10        (9)
1,1,2,2         (10)
1,1,2,3         (11)
1,1,2,4         (12)
1,1,2,5         (13)
1,1,3,3         (14)
1,1,5,9         (15)
1,1,5,10        (16)
1,1,6,7         (17)
1,1,6,10        (18)
1,1,7,7         (19)
1,1,7,8         (20)
1,1,7,9         (21)
1,1,8,9         (22)
1,1,8,10        (23)
1,1,9,9         (24)
1,1,9,10        (25)
1,1,10,10       (26)
1,2,2,2         (27)
1,2,2,3         (28)
1,2,9,9         (29)
1,2,9,10        (30)
1,2,10,10       (31)
1,3,5,5         (32)
1,4,7,10        (33)
1,4,8,10        (34)
1,4,9,9         (35)
1,5,5,7         (36)
1,5,5,8         (37)
1,5,7,7         (38)
1,6,6,7         (39)
1,6,7,7         (40)
1,6,7,8         (41)
1,6,10,10       (42)
1,7,7,7         (43)
1,7,7,8         (44)
1,7,10,10       (45)
1,8,9,9         (46)
1,8,9,10        (47)
1,8,10,10       (48)
1,9,9,9         (49)
1,9,9,10        (50)
1,9,10,10       (51)
1,10,10,10      (52)
2,2,2,2         (53)
2,2,2,6         (54)
2,2,7,9         (55)
2,2,9,9         (56)
2,3,3,4         (57)
2,5,5,5         (58)
2,5,5,6         (59)
2,5,9,9         (60)
2,6,7,7         (61)
2,7,7,7         (62)
2,7,7,9         (63)
2,7,8,10        (64)
2,7,9,9         (65)
2,9,9,9         (66)
2,9,9,10        (67)
2,10,10,10      (68)
3,3,4,10        (69)
3,3,5,8         (70)
3,3,7,10        (71)
3,3,10,10       (72)
3,4,6,7         (73)
3,4,8,8         (74)
3,4,9,10        (75)
3,5,5,5         (76)
3,5,5,10        (77)
3,5,7,7         (78)
3,5,8,10        (79)
3,7,8,10        (80)
3,10,10,10      (81)
4,4,5,9         (82)
4,4,6,6         (83)
4,4,6,7         (84)
4,4,9,9         (85)
4,4,9,10        (86)
4,7,7,9         (87)
4,7,7,10        (88)
4,9,9,9         (89)
4,9,10,10       (90)
4,10,10,10      (91)
5,5,5,7         (92)
5,5,5,8         (93)
5,5,5,10        (94)
5,5,6,9         (95)
5,5,6,10        (96)
5,5,7,9         (97)
5,6,7,10        (98)
5,7,7,7         (99)
5,7,7,8         (100)
5,7,9,9         (101)
5,8,9,9         (102)
5,8,9,10        (103)
5,8,10,10       (104)
5,9,9,9         (105)
5,9,9,10        (106)
5,10,10,10      (107)
6,6,6,7         (108)
6,6,7,7         (109)
6,6,7,8         (110)
6,6,9,9         (111)
6,6,10,10       (112)
6,7,7,7         (113)
6,7,7,8         (114)
6,7,7,9         (115)
6,7,8,8         (116)
6,7,9,10        (117)
6,8,10,10       (118)
6,9,9,9         (119)
6,9,10,10       (120)
7,7,7,7         (121)
7,7,7,8         (122)
7,7,7,9         (123)
7,7,7,10        (124)
7,7,8,8         (125)
7,7,8,9         (126)
7,7,8,10        (127)
7,7,9,9         (128)
7,7,10,10       (129)
7,8,8,8         (130)
7,8,9,9         (131)
7,9,9,9         (132)
7,9,9,10        (133)
7,9,10,10       (134)
7,10,10,10      (135)
8,8,8,8         (136)
8,8,8,9         (137)
8,8,9,9         (138)
8,8,9,10        (139)
8,8,10,10       (140)
8,9,9,9         (141)
8,9,9,10        (142)
8,9,10,10       (143)
8,10,10,10      (144)
9,9,9,9         (145)
9,9,9,10        (146)
9,9,10,10       (147)
9,10,10,10      (148)
10,10,10,10     (149)
共有715种出牌,除149种无解外,其余都可通过加减乘除得到24。
*/
2010-11-16 10:04
yu_hua
Rank: 2
等 级:论坛游民
帖 子:222
专家分:95
注 册:2006-8-10
收藏
得分:0 
/*------------------------------
【原创】24点游戏程序之三
--更简短、仅30多行代码

-------------------------------*/
#include<stdio.h>
#include <math.h>

int MAX=10;//扑克牌的最大点数10,可改别的数字,如13等

double op(double x,int iop,double y)
{   if(iop==1)return x+y;
    if(iop==2)return fabs(x-y); //总让大减小
    if(iop==3)return x*y;
    if(iop==4)return y?x/y:-9999; //避免零除
    else      return x?y/x:-9999; //避免零除
}

int main( void )
{   int p[5],op1,op2,op3,m,noslv=0,S[]={ //24种全排列对应的下标变量
    1,2,3,4,1,2,4,3,1,3,2,4,1,3,4,2,1,4,2,3,1,4,3,2, 2,1,3,4,2,1,4,3,2,3,1,4,2,3,4,1,2,4,1,3,2,4,3,1,
    3,1,2,4,3,1,4,2,3,2,1,4,3,2,4,1,3,4,1,2,3,4,2,1, 4,1,2,3,4,1,3,2,4,2,1,3,4,2,3,1,4,3,1,2,4,3,2,1};
    for(p[1]=  1 ;p[1]<=MAX;p[1]++) //全
    for(p[2]=p[1];p[2]<=MAX;p[2]++) //盘
    for(p[3]=p[2];p[3]<=MAX;p[3]++) //搜
    for(p[4]=p[3];p[4]<=MAX;p[4]++) //索
    {  for( m=0; m<4*2*3*4; m+=4 )  //试探4张牌的24种全排列
       {  int a=p[S[m+0]],b=p[S[m+1]]; //也可定义为double型
          int c=p[S[m+2]],d=p[S[m+3]]; //也可定义为double型
          for(op1=1;op1<=4;op1++) //op1: 加减乘除共4种
          for(op2=1;op2<=4;op2++) //op2: 加减乘除共4种
          for(op3=0;op3<=4;op3++) //op3: 加减乘除还有“反除”共5种
          {  if(fabs(op(op(a,op1,b),op3,op(c,op2,d))-24)<1e-8)goto suc;//类似(7-3)*(8-2)
             if(fabs(op(op(op(a,op1,b),op2,c),op3,d)-24)<1e-8)goto suc;//类似(10-2)*9/3
          }
       }
       printf("%d,%d,%d,%d: no solution (%d)\n",p[1],p[2],p[3],p[4],++noslv);//打印无效组合及编号
       suc: continue; //进入下一个出牌组合
    }  getchar(); //避免屏幕一闪而过
    return 0;
}

[ 本帖最后由 yu_hua 于 2010-11-17 20:04 编辑 ]
2010-11-17 19:57
xouou_53320
Rank: 1
等 级:新手上路
帖 子:3
专家分:6
注 册:2010-7-29
收藏
得分:1 
牛叉啊 呵呵 24外挂了
2010-11-17 23:21
skysea575
Rank: 1
来 自:中国
等 级:新手上路
帖 子:1
专家分:0
注 册:2010-11-3
收藏
得分:0 
只是解的形式不仅仅是一种形式。这种解法漏太多的解了。
2010-11-19 19:04
快速回复:【原创】24点游戏程序之一
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.063795 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved