| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 8688 人关注过本帖, 1 人收藏
标题:【原创】24点游戏程序之一
只看楼主 加入收藏
yu_hua
Rank: 2
等 级:论坛游民
帖 子:222
专家分:95
注 册:2006-8-10
收藏
得分:0 
/* 以下代码(120行)给出24点游戏全部独立解 */
#include<stdio.h>
int MAX=13;//扑克牌的最大点数
int way;
void print(char *format,int a,char o1,int b,char o2,int c,char o3,int d)
{    way++;
     if(way==1)printf("\n");
     printf(format,a,o1,b,o2,c,o3,d);
}
int OP(int x,int iop,int y)
{   if(iop==1)return x>=y ? x+y:-9999;
    if(iop==2)return x>=y ? x-y:-9999;
    if(iop==3)return x>=y ? x*y:-9999;
    if(iop==4)if(y && y-1 && x%y==0)return x/y;
    return -9999;
}
int op(int x,int iop,int y)
{   if(iop==1)return x+y;else
    if(iop==3)return x*y;else
    return OP(x,iop,y);
}
int quan_pai_lie(int a[],int n)
{ //from 54321 to 12345
    int i,j,k,temp,t;
    for(k=n-1;k>0;k--)
     if(a[k-1]>a[k])break;
    if(k==0)return 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])
      {t=a[j];a[j]=a[j+1];a[j+1]=t;}
    return 1;
}
#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++)
int main(void)
{   int p[5],A[5],noslv=0;
    int a,b,c,d,op1,op2,op3;
   char os[]=" +-*/";
    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]++) //索
    {
       A[4]=p[1],A[3]=p[2],A[2]=p[3],A[1]=p[4];
       a=A[1];b=A[2];c=A[3];d=A[4]; way=0;
       printf("%d,%d,%d,%d: ",p[1],p[2],p[3],p[4]);
       if(a==13 && b==13 && c==12 && d==12) //K-K+Q+Q
          print("%d%c%d%c%d%c%d=24\n",a,os[2],b,os[1],c,os[1],d);
       DO(op1,1,2, op2,1,2, op3,1,2) {//此法唯一遗漏K-K+Q+Q
          if(OP(OP(OP(a,op1,b),op2,c),op3,d)==24) //a+b+c+d,a+b+c-d,a+b-c-d
          if( !(op2==2 && op3==1 && c==d) )
             print("%d%c%d%c%d%c%d=24\n",a,os[op1],b,os[op2],c,os[op3],d);
       }
       DO(op1,3,4, op2,3,4, op3,3,4) {//abcd, abc/d, ab/c/d
          if(OP(OP(OP(a,op1,b),op2,c),op3,d)==24) {
             if( !(op2==4 && op3==3 && c==d) &&
                 !(op1==4 && op3==3 && d==b) &&
                 !(op1==4 && op2==3 && b==c) )
                 print("%d%c%d%c%d%c%d=24\n",a,os[op1],b,os[op2],c,os[op3],d);
             }
          else if(b-c && OP(OP(OP(a,op1,c),op2,d),op3,b)==24 && op3==4)
             print("%d%c%d%c%d%c%d=24\n",a,os[op1],c,os[op2],d,os[op3],b);
          else if(a-b && OP(OP(OP(b,op1,c),op2,d),op3,a)==24 && op3==4)
             print("%d%c%d%c%d%c%d=24\n",b,os[op1],c,os[op2],d,os[op3],a);
       }
       do
       {   a=A[1];b=A[2];c=A[3];d=A[4];
           DO(op1,1,2, op2,1,2, op3,0,0) {//(a±b±c)*d
              if(OP(OP(a,op1,b),op2,c)*d==24 && !(op1==2 && op2==1) && !(op1==op2 && b<c))
                 print("(%d%c%d%c%d)%c%d=24\n",a,os[op1],b,os[op2],c,os[3],d);
           }
           if(op(OP(a,3,b),1,c)*d==24)print("(%d%c%d%c%d)%c%d=24\n",a,os[3],b,os[1],c,os[3],d); //(a*b+c)*d
           if(op(OP(a,3,b),2,c)*d==24)print("(%d%c%d%c%d)%c%d=24\n",a,os[3],b,os[2],c,os[3],d); //(a*b-c)*d
           DO(op1,1,2, op2,0,0, op3,1,4) {
           if(op(OP(a,op1,b)*c,op3,d)==24 && !(op3==3 && c<d)) //(a±b)*c±d,(a±b)*c*d,(a±b)*c/d
              print("(%d%c%d)%c%d%c%d=24\n",a,os[op1],b,os[3],c,os[op3],d);
           if(op(OP(OP(a,op1,b),4,c),op3,d)==24 && op3<3) //(a±b)/c±d
              print("(%d%c%d)%c%d%c%d=24\n",a,os[op1],b,os[4],c,os[op3],d);
           }
           DO(op1,3,4, op2,1,4, op3,1,2) {//a*b±c±d, a/b±c±d, a*b*c±d, a*b/c±d
              if(op(op(OP(a,op1,b),op2,c),op3,d)==24 && !(op2==op3 && c<d) && !(op2==2 && op3==1)
                 && !(op1*op2==9 && b<c) && !(op1==4 && op2==3)){
                 print("%d%c%d%c%d%c%d=24\n",a,os[op1],b,os[op2],c,os[op3],d);
                 if(b==1 && op2<3||c==1 && op1==3)goto next;    }
           }
           next:
           if(op(op(OP(a,3,b),1,c),4,d)==24)print("(%d%c%d%c%d)%c%d=24\n",a,os[3],b,os[1],c,os[4],d); //(a*b+c)/d
           if(op(op(OP(a,3,b),2,c),4,d)==24)print("(%d%c%d%c%d)%c%d=24\n",a,os[3],b,os[2],c,os[4],d); //(a*b-c)/d
           if(op(OP(c,2,OP(a,3,b)),3,d)==24)print("(%d%c%d%c%d)%c%d=24\n",c,os[2],a,os[3],b,os[3],d); //(c-a*b)*d
           DO(op1,1,2, op2,1,2, op3,0,0) {
              if(OP(OP(a,op1,b),3,OP(c,op2,d))==24)           //(a±b)*(c±d)
                 print("(%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 && op2==2) //(a±b)-(c/d)
                 print("%d%c%d%c%d%c%d=24\n",a,os[op1],b,os[op2],c,os[4],d);
           }
           DO(op1,0,0, op2,1,2, op3,3,4) {
              if(OP(OP(a,3,b),op2,OP(c,op3,d))==24) //(a*b)±(c*d), (a*b)±(c/d)
                 print("%d%c%d%c%d%c%d=24\n",a,os[3],b,os[op2],c,os[op3],d);
              if(op3==4 && OP(OP(a,3,b),op3,OP(c,op2,d))==24)     //(a*b)/(c±d)
                 print("%d%c%d%c(%d%c%d)=24\n",a,os[3],b,os[op3],c,os[op2],d);
           }
           // 以下涉及实型除法
           for(op2=1;op2<=2;op2++)    //(a/b±c)*d
              if(op(a,op2,b*c)*d==24*b && b-1)
                 print("(%d%c%d%c%d)%c%d=24\n",a,os[4],b,os[op2],c,os[3],d);
           if((b*c-a)*d==24*b && b-1) //(c-a/b)*d
              print("(%d%c%d%c%d)%c%d=24\n",c,os[2],a,os[4],b,os[3],d);
           if(d*b==(c*b-a)*24)        //d/(c-a/b)
              print("%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)        //d/(a/b±c)
              print("%d%c(%d%c%d%c%d)=24\n",d,os[4],a,os[4],b,os[2],c);
       }
       while(quan_pai_lie(A+1,4));
       if(!way)printf("failure(%d)\n",++noslv);//无效组合编号 458 for K
    }
    return(0);
}

2010-11-21 18:15
御坂美琴
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:魔術の禁書目錄
等 级:小飞侠
威 望:9
帖 子:952
专家分:2929
注 册:2010-8-18
收藏
得分:0 
我有兴趣的是,你能排除掉1*2*3*4与4*3*2*1这种类似的等价解么
还有(3 + 9) * 2 * 1 与 (3 * 1 + 9) * 2

永远为正义而奋斗,锄强扶弱的Level 5 超能力者
とある魔術の禁書目錄インデックス__御み坂さか美み琴こと
http://bbs.bccn.net/space.php?action=threads&uid=483997
2010-11-21 19:28
BlueGuy
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:29
帖 子:4476
专家分:4055
注 册:2009-4-18
收藏
得分:0 
楼主, 你有做科学家的潜质 。/

我就是真命天子,顺我者生,逆我者死!
2010-11-21 19:30
yu_hua
Rank: 2
等 级:论坛游民
帖 子:222
专家分:95
注 册:2006-8-10
收藏
得分:0 
以下是引用御坂美琴在2010-11-21 19:28:59的发言:

我有兴趣的是,你能排除掉1*2*3*4与4*3*2*1这种类似的等价解么
还有(3 + 9) * 2 * 1 与 (3 * 1 + 9) * 2
能排除掉1*2*3*4与4*3*2*1这种类似的等价解
目前还不能排除“*1”引起的诸如
(3 + 9) * 2 * 1 与 (3 * 1 + 9) * 2 的等价解
除非延长代码。
2010-11-21 19:43
御坂美琴
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:魔術の禁書目錄
等 级:小飞侠
威 望:9
帖 子:952
专家分:2929
注 册:2010-8-18
收藏
得分:0 
*1与/1
+0与-0
2+2与2*2
加法乘法交换律和结合律
无视连除和连减次序
目前想到这么多,其它的我得查查代码,我不记得以前的怎么写的了,条件很多

永远为正义而奋斗,锄强扶弱的Level 5 超能力者
とある魔術の禁書目錄インデックス__御み坂さか美み琴こと
http://bbs.bccn.net/space.php?action=threads&uid=483997
2010-11-21 19:57
pangding
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:北京
等 级:贵宾
威 望:94
帖 子:6784
专家分:16751
注 册:2008-12-20
收藏
得分:0 
膜拜膜拜----
2010-11-21 20:23
yu_hua
Rank: 2
等 级:论坛游民
帖 子:222
专家分:95
注 册:2006-8-10
收藏
得分:0 
以下是21楼程序的部分输出。不难看出,该版主要的不理想之处
就是“*1”泛滥成灾!但是“/1”已经被代码禁止住了。。。。
1,1,1,12:
(1+1)*12*1=24
(1*1+1)*12=24 严格说此行与上一行属于同一个解
1,1,2,6:
(2+1+1)*6=24
(1+1)*6*2=24
1,1,2,8:
(2+1)*8*1=24
(2*1+1)*8=24 严格说此行与上一行属于同一个解
(1*1+2)*8=24 严格说此行与上一行也属于同一解
1,1,2,10:
(10+2)*(1+1)=24
(10+1+1)*2=24
1,1,2,11:
11*2+1+1=24
(11+1)*2*1=24
(11*1+1)*2=24 严格说此行与上一行属于同一个解
(1*1+11)*2=24 严格说此行与上一行属于同一个解
(1+1)*11+2=24
1,1,2,12:
12*2*1*1=24 代码已禁止“2*1*1*12”等
12*2+1-1=24 代码已禁止“12*2-1+1”
(12+1-1)*2=24
(2+1-1)*12=24
12/(1-1/2)=24
1,1,2,13:
13*2-1-1=24
(13-1)*2*1=24
(13*1-1)*2=24 严格说此行与上一行属于同一个解
(13-1*1)*2=24 严格说此行与上一行属于同一个解
(1+1)*13-2=24
1,1,3,6:
(6+1+1)*3=24
(3+1)*6*1=24
(3*1+1)*6=24 严格说此行与上一行属于同一个解
(1*1+3)*6=24 严格说此行与上一行属于同一个解
1,1,3,7:
(7+1)*3*1=24
(7*1+1)*3=24 严格说此行与上一行属于同一个解
(1*1+7)*3=24 严格说此行与上一行属于同一个解
(7-1)*(3+1)=24
1,1,3,8:
8*3*1*1=24
8*3+1-1=24
(8+1-1)*3=24
(3+1-1)*8=24
1,1,3,9:
(9+3)*(1+1)=24
(9-1)*3*1=24
(9*1-1)*3=24 严格说此行与上一行属于同一个解
(9-1*1)*3=24 严格说此行与上一行属于同一个解
。。。。。。。。。。。。。。。。。。。。。。
1,1,4,4:
(4+1+1)*4=24 代码已禁止“(1+4+1)*4”及“4*(4+1+1)”等的出现
。。。。。。。。。。。。。。。。。。。。。。
1,1,4,8:
(8+4)*(1+1)=24
(8-1-1)*4=24
(4-1)*8*1=24
(4*1-1)*8=24
(4-1*1)*8=24
1,1,4,9:
(9-1)*(4-1)=24
1,1,4,10:
(1+1)*10+4=24
1,1,4,12:
12*4/(1+1)=24
(4-1-1)*12=24
1,1,5,5:
(5*5-1)*1=24
5*5*1-1=24
5*5-1*1=24
(5+1)*(5-1)=24
1,1,5,6:
(6-1)*5-1=24
(5-1)*6*1=24
(5*1-1)*6=24
(5-1*1)*6=24
1,1,5,7:
(7+5)*(1+1)=24
(7-1)*(5-1)=24
1,1,5,8:
(5-1-1)*8=24
1,1,6,6:
(6+6)*(1+1)=24
(6-1-1)*6=24
1,1,6,8:
8*6/(1+1)=24
1,1,6,9:
(1+1)*9+6=24
1,1,6,12:
(1+1)*6+12=24
1,1,7,10:
(1+1)*7+10=24
1,1,8,8:
(1+1)*8+8=24
1,1,9,13:
13+9+1+1=24 代码已禁止“1+9+1+13”等
1,1,10,12:
12+10+1+1=24
1,1,10,13: 以下7行最能暴露21楼代码的不足
(13+10+1)*1=24
(13+10)*1+1=24
13*1+10+1=24
(13+1)*1+10=24
10*1+13+1=24
(10+1)*1+13=24
1*1+13+10=24
1,1,11,11:
11+11+1+1=24
1,1,11,12:
(12+11+1)*1=24
(12+11)*1+1=24
12*1+11+1=24
(12+1)*1+11=24
11*1+12+1=24
(11+1)*1+12=24
1*1+12+11=24
1,1,11,13:
13+11+1-1=24
(13+11)*1*1=24
(13*1+11)*1=24
13*1+11*1=24
13*1*1+11=24
(11*1+13)*1=24
11*1*1+13=24
1,1,12,12:
12+12+1-1=24
(12+12)*1*1=24
(12*1+12)*1=24
12*1+12*1=24
12*1*1+12=24
1,1,12,13:
(13+12-1)*1=24
(13+12)*1-1=24
13*1+12-1=24
(13-1)*1+12=24
12*1+13-1=24
(12-1)*1+13=24
1,1,13,13:
13+13-1-1=24

1,2,2,4:
(2+1)*4*2=24
1,2,2,5:
(5+1)*2*2=24
(5+1)*(2+2)=24
1,2,2,6:
6*2*2*1=24
(6+2)*(2+1)=24
(2+2)*6*1=24
(2*1+2)*6=24
1,2,2,7: 以下两式代表同一个算法吗?
(7-1)*2*2=24
(7-1)*(2+2)=24

1,2,2,8: 以下两式代表同一个算法吗?
(2+2-1)*8=24
(2*2-1)*8=24

1,2,2,9:
(9+2+1)*2=24
1,2,2,10:
(10+2)*2*1=24
(10-2)*(2+1)=24
(10*1+2)*2=24
(10+1)*2+2=24
(2*1+10)*2=24
1,2,2,11:
(11*2+2)*1=24
11*2+2*1=24
(11+2-1)*2=24
11*2*1+2=24
1,2,2,12:
(12-1)*2+2=24
(12+1)*2-2=24
(2/2+1)*12=24
(2-1)*12*2=24
1,2,2,13:
(13*2-2)*1=24
13*2-2*1=24
13*2*1-2=24
(13+1-2)*2=24
1,2,3,3:
(3+1)*3*2=24
1,2,3,4:
4*3*2*1=24
(4+2)*(3+1)=24
(3+2+1)*4=24

1,2,3,5:
(5+3)*(2+1)=24
(5+2+1)*3=24
(5-1)*3*2=24
(3+2)*5-1=24
1,2,3,6:
(6+2)*3*1=24
(6*1+2)*3=24
(3+2-1)*6=24
(3-1)*6*2=24
(2*1+6)*3=24
1,2,3,7:
7*3+2+1=24
(7+2-1)*3=24
(2+1)*7+3=24
1,2,3,8:
(8+3+1)*2=24
(8-2)*(3+1)=24
8/(1-2/3)=24
(2-1)*8*3=24
1,2,3,9:
(9+3)*2*1=24
9*3-2-1=24
(9*1+3)*2=24
(9+1-2)*3=24
(3*1+9)*2=24
(2+1)*9-3=24
1,2,3,10:
(10+3-1)*2=24
(10-2)*3*1=24
10*2+3+1=24
(10+2)*(3-1)=24
(10*1-2)*3=24
(10-2*1)*3=24
1,2,3,11:
(11-3)*(2+1)=24
11*2+3-1=24
(11-2-1)*3=24
(3-1)*11+2=24
1,2,3,12:
12/(3/2-1)=24
(3+1)*12/2=24
(3+1-2)*12=24
1,2,3,13:
13*2+1-3=24
(3-1)*13-2=24
2010-11-22 21:08
jack10141
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:陕西西安
等 级:小飞侠
威 望:6
帖 子:706
专家分:2271
注 册:2010-8-10
收藏
得分:0 
牛人在对侃呢!大家都来观战啊!!!!!!!!!

Coding就像一盒巧克力,你永远不会知道你会遇到什么BUG
别跟我说你是不能的,这让我愤怒,因为这侮辱了你的智慧
2010-11-22 21:34
huliangmao
Rank: 2
等 级:论坛游民
帖 子:26
专家分:53
注 册:2010-11-17
收藏
得分:0 
好可怕啊!
2010-11-22 22:20
五当家
Rank: 12Rank: 12Rank: 12
等 级:火箭侠
威 望:2
帖 子:1112
专家分:3674
注 册:2010-10-20
收藏
得分:0 
我晕了,这游戏怎么玩的呀?我没玩过呢.

经验积累中............
2010-11-23 12:30
快速回复:【原创】24点游戏程序之一
数据加载中...
 
   



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

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