| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 8688 人关注过本帖, 1 人收藏
标题:【原创】24点游戏程序之一
只看楼主 加入收藏
BlueGuy
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:29
帖 子:4476
专家分:4055
注 册:2009-4-18
收藏
得分:0 
但愿以后的 stl啥的 不是你写的,

我就是真命天子,顺我者生,逆我者死!
2010-11-28 12:20
思安玉
Rank: 2
来 自:安徽宿州泗县
等 级:论坛游民
帖 子:15
专家分:16
注 册:2010-11-1
收藏
得分:0 
24点游戏是什么啊   我没玩过  说说看
2010-11-28 13:50
wbbgnn
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2010-11-28
收藏
得分:0 
学习了,感觉有点看不懂了
不过还在看,谢谢
2010-11-28 16:38
yu_hua
Rank: 2
等 级:论坛游民
帖 子:222
专家分:95
注 册:2006-8-10
收藏
得分:0 
// 24点游戏程序(迄今最令俺满意的一个)
#define MAXP 13 //也可定义为10或其它正整数
#include<stdio.h>
#define DO(I,a1,a2, J,m1,m2, K,z1,z2) for(K=z1;K<=z2;K++)for(J=m1;J<=m2;J++)for(I=a1;I<=a2;I++)
#define fmt0   "%d%c%d%c%d%c%d=24\n"
#define fmt2 "(%d%c%d)%c%d%c%d=24\n"
#define fmt3 "(%d%c%d%c%d)%c%d=24\n"
char os[]="@+-*/";
int  way,op1,op2,op3;
void s04(int,int,int,int);
void s05(int,int,int,int);
void s06(int,int,int,int);
void s08(int,int,int,int);
//-- 定义四则运算 --
int op(int x,int iop,int y)
{   int ret=-9999;
    switch(iop)
    {
    default: break;
    case 1 : ret= x+y; break;
    case 2 : ret= x-y; break;
    case 3 : ret= x*y; break;
    case 4 : if(y>1 && x%y==0)ret=x/y;
    }
    return ret;
}
//-- 计数与显示 --
void print2(char *format,int a,char o1,int b,char o2,int c,char o3,int d)
{    if(++way==1)printf("\n");
     printf(format,a,o1,b,o2,c,o3,d);
}
//-- “一式六份” --
void use(void(*fun)(),int a,int b,int c,int d)
{
    (*fun)(a,b,c,d);if(a-c||b-d)(*fun)(c,d,a,b);
    if(a-b && c-d){(*fun)(a,d,b,c);(*fun)(b,c,a,d);}
    if(b-c){(*fun)(a,c,b,d);if(a-b||c-d)(*fun)(b,d,a,c);}
}
//-- 运算模式系列 --
void m02(int a,int b,int c, int d)
{
    DO( op3,1,2, op2,1,2, op1,1,2 )
    if(op(op(op(op(0,op1,a),op2,b),op3,c),3,d)==24)
    {  op1==2? print2(fmt3,b,os[op3],c,os[op1],a,os[3],d):
               print2(fmt3,a,os[op2],b,os[op3],c,os[3],d);
       return;
    }
}
void m03(int a,int b,int c,int d)
{   int t1,t2;
    DO( op3,0,0, op2,1,2, op1,3,4 )
    if(op(t1=op(a,3,b),op2,t2=op(c,op1,d))==24 && !(d*b==1) && t1>=t2)
    {  if(a*b==24/2 && a<c)continue;
       print2(fmt0,a,os[3],b,os[op2],c,os[op1],d);
    }
    DO( op3,0,0, op2,1,2, op1,1,2 )
    {  if(op(t1=op(a,op1,b),3,t2=op(c,op2,d))==24 && t1>=t2)
          print2("(%d%c%d)%c(%d%c%d)=24\n",a,os[op1],b,os[3],c,os[op2],d);
       if(op(op(a,op1,b),op2,op(c,4,d))==24)
          print2(fmt0,a,os[op1],b,os[op2],c,os[4],d);
    }
    for(op2=1; op2<=2; op2++)
     if(op(op(a,3,b),4,op(c,op2,d))==24)
        print2("%d%c%d%c(%d%c%d)=24\n",a,os[3],b,os[4],c,os[op2],d);
}
void m04(int a,int b,int c,int d){s04(a,b,c,d);if(c-d)s04(a,b,d,c);}
void m05(int a,int b,int c,int d){s05(a,b,c,d);if(c-d)s05(a,b,d,c);}
void m06(int a,int b,int c,int d){s06(a,b,c,d);if(c-d)s06(a,b,d,c);}
void m07(int a,int b,int c,int d)
{
    DO( op3,0,0, op2,1,2, op1,1,2 )
    if( op(op(op(a,3,b),op1,c),op2,d)==24 && b>1 && !(c==d && op1>op2))
        print2(fmt0,a,os[3],b,os[op1],c,os[op2],d);
    DO( op3,0,0, op2,1,2, op1,3,4 )
    {   if(op(op(op(a,3,b),op1,c),op2,d)==24 && c>1 && !(op1==3 && b<c))
           print2(fmt0,a,os[3],b,os[op1],c,os[op2],d);
        if(c==d)continue;
        if(op(op(op(a,3,b),op1,d),op2,c)==24 && d>1 && !(op1==3 && b<d))
           print2(fmt0,a,os[3],b,os[op1],d,os[op2],c);
    }
}
void m08(int a,int b,int c,int d)
{   s08(a,b,c,d);if(c-d)s08(a,b,d,c);
    if(a-b){s08(b,a,c,d);if(c-d)s08(b,a,d,c);}
}
//-- 子程序系列 --
void s04(int a,int b,int c,int d)
{
    DO(op1,0,0, op2,1,2, op3,3,4)
    {  int ans=op(op(a*b,op2,c),op3,d);
       if(ans*ans==24*24 && d>1 && b>1)
       ans==24? print2(fmt3,a,os[3],b,os[op2],c,os[op3],d):
                print2(fmt3,c,os[op2],a,os[3],b,os[op3],d);
    }
}
void s05(int a,int b,int c,int d)
{
    DO( op3,1,2, op2,0,0, op1,1,2 )
    if(op(op(a,op1,b)*c,op3,d)==24 && c>1)
       print2(fmt2,a,os[op1],b,os[3],c,os[op3],d);
    DO( op3,3,4, op2,0,0, op1,1,2 )
    if(op(op(a,op1,b)*c,op3,d)==24 && (op3>3||c>=d))
       print2(fmt2,a,os[op1],b,os[3],c,os[op3],d);
}
void s06(int a,int b,int c,int d)
{
    DO( op3,1,2, op2,0,0, op1,1,2 )
    if(op(op(op(a,op1,b),4,c),op3,d)==24)
       print2(fmt2,a,os[op1],b,os[4],c,os[op3],d);
}
void s08(int a,int b,int c,int d)
{    if((a+b*c)*d==24*b && b>1)
        print2(fmt3,a,os[4],b,os[1],c,os[3],d);
     if((a-b*c)*d==24*b && b>1)
        print2(fmt3,a,os[4],b,os[2],c,os[3],d);
     if((b*c-a)*d==24*b && b>1)
        print2(fmt3,c,os[2],a,os[4],b,os[3],d);
     if(d*b==(c*b-a)*24)
        print2("%d%c(%d%c%d%c%d)=24\n",d,os[4],c,os[2],a,os[4],b);
     if(d*b==(a-c*b)*24)
        print2("%d%c(%d%c%d%c%d)=24\n",d,os[4],a,os[4],b,os[2],c);
}
//----------------------------------------------------------------
int main( void )
{
    int d,c, b,a,noslv=0;
    for(d=1; d<=MAXP; d++)
    for(c=d; c<=MAXP; c++)
    for(b=c; b<=MAXP; b++)
    for(a=b; a<=MAXP; a++)
    //printf("请从小到大输入4张牌: ");///////////
    //scanf("%d%*c%d%*c%d%*c%d",&d,&c,&b,&a);////
    {
       way=0;
       printf("%d,%d,%d,%d: ",d,c,b,a);
       if(op(a+b+c,1,d)==24)print2(fmt0,a,os[1],b,os[1],c,os[1],d);else
       if(op(a+b+c,2,d)==24)print2(fmt0,a,os[1],b,os[1],c,os[2],d);else
       if(op(a+b+d,2,c)==24)print2(fmt0,a,os[1],b,os[1],d,os[2],c);else
       if(op(a+c+d,2,b)==24)print2(fmt0,a,os[1],c,os[1],d,os[2],b);else
       if(op(b+c+d,2,a)==24)print2(fmt0,b,os[1],c,os[1],d,os[2],a);else
       if(op(a+b,2,c+d)==24)print2(fmt0,a,os[1],b,os[2],c,os[2],d);
       if(op(a*b*c,3,d)==24)print2(fmt0,a,os[3],b,os[3],c,os[3],d);else
       if(op(a*b*c,4,d)==24)print2(fmt0,a,os[3],b,os[3],c,os[4],d);else
       if(op(a*b*d,4,c)==24)print2(fmt0,a,os[3],b,os[4],c,os[3],d);else
       if(op(a*c*d,4,b)==24)print2(fmt0,a,os[4],b,os[3],c,os[3],d);else
       if(op(b*c*d,4,a)==24)print2(fmt0,b,os[3],c,os[3],d,os[4],a);else
       if(op(a*b,4,c*d)==24)print2(fmt0,a,os[3],b,os[4],c,os[4],d);
       m02(a,b,c,d);if(c-d)m02(a,b,d,c);if(b-c)m02(a,c,d,b);if(a-b)m02(b,c,d,a);
       use(m03, a,b,c,d);  use(m04, a,b,c,d);  use(m05, a,b,c,d);
       use(m06, a,b,c,d);  use(m07, a,b,c,d);  use(m08, a,b,c,d);
       if(!way) printf("failure(%d)\n",++noslv);
    }
    return(0);
}
2010-11-30 10:35
晨曦风海
Rank: 1
等 级:新手上路
帖 子:2
专家分:0
注 册:2010-11-13
收藏
得分:0 
  为什么总是会有错误啊
2010-12-01 20:06
半片叶zick
Rank: 2
等 级:论坛游民
帖 子:53
专家分:44
注 册:2010-11-30
收藏
得分:0 
这个很强大,什么时候我能写这个呢?
2010-12-06 23:40
flydream0
Rank: 1
等 级:新手上路
帖 子:20
专家分:7
注 册:2008-10-10
收藏
得分:0 
问题是一点注释都没........
2010-12-07 22:34
vicojiro9058
Rank: 1
等 级:新手上路
帖 子:2
专家分:0
注 册:2010-11-26
收藏
得分:0 
太精深了! 我什么时候才有这功底
2010-12-08 20:52
一线天的看客
Rank: 1
等 级:新手上路
帖 子:2
专家分:0
注 册:2010-12-9
收藏
得分:0 
  这种程序运行应该需要的时间比较长吧??
2010-12-09 10:11
sunyh1999
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:14
帖 子:1178
专家分:3032
注 册:2009-5-17
收藏
得分:0 
回复 36楼 yu_hua
记忆式搜索是个好办法,但还有办法简化

欢迎来到我的博客:http://blog..cn/noisunyuhong
2010-12-09 20:00
快速回复:【原创】24点游戏程序之一
数据加载中...
 
   



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

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