C语言算24点

作者&投稿:施娇 (若有异议请与网页底部的电邮联系)
C语言24点的算法?~

  下面是我自己写的一个程序:

  我的解法是把这个问题分解成了两个子问题,首先求出4个数字的无重复全排列,放到一个数组里面,再对没一个排列情况,从头到尾穷举所有的四则运算情况。注意到除法是特殊的,我用x/y表示x除以y,用x|y表示x分之y。注意到,如果穷举的解得到-24的话,只需要把有减法的地方调换一下顺序就可以了,代码如下
  /***********************************************************************************/
  #include
  #include
  #include
  #include
  int index[4]={0,1,2,3};//used to generate subscription collection
  int sub[4]; //used in p() only
  float f[4]={8.0f,3.0f,3.0f,8.0f};//the 24 point numbers
  float fs[24][4];//all possible permutaions of f
  float tmp[4]; //used for buf
  int g_number=0; //number of permutations
  float RES[4];
  char op[3];
  void p(int idx){//求全排列的函数
  if(idx==4){
  for(int i=0;i<4;++i){tmp[i]=f[sub[i]];}
  for(int g=0;g<g_number;++g){if(memcmp(fs[g],tmp,sizeof(float)*4)==0)return;}
  for(int i=0;i<4;++i){fs[g_number][i]=f[sub[i]];}
  g_number++;
  return;
  }
  for(int i=0;i<4;++i){//make subscription collections
  bool dupflag=false;
  for(int j=0;j<idx;++j){if(sub[j]==i)dupflag=true;}
  if(dupflag==true)continue;
  sub[idx]=index[i];
  p(idx+1);
  }
  }
  void solve(int L){//对某个排列,递归求所有四则运算的结果,找到就退出
  if(L==3){
  if(fabs(fabs(RES[L])-24.0f)<0.01f){
  printf("Found solution,RES=%f,((%d%c%d)%c%d)%c%d
",RES[L],
  (int)f[0],op[0],
  (int)f[1],op[1],
  (int)f[2],op[2],
  (int)f[3]);
  exit(0);
  }
  return;
  }
  for(int j=0;j<5;++j){//j judges for operators
  if(j==0){RES[L+1]=RES[L]+tmp[L+1];op[L]='+';solve(L+1);}
  if(j==1){RES[L+1]=RES[L]-tmp[L+1];op[L]='-';solve(L+1);}
  if(j==2){RES[L+1]=RES[L]*tmp[L+1];op[L]='*';solve(L+1);}
  if(j==3&&tmp[L+1]!=0)
  {RES[L+1]=RES[L]/tmp[L+1];op[L]='/';solve(L+1);}
  if(j==4&&RES[L+1]!=0)
  {RES[L+1]=tmp[L+1]/RES[L];op[L]='|';solve(L+1);}
  }
  }
  int main(int argc,char* argv[]){//should avoid 0
  f[0]=atoi(argv[1]);
  f[1]=atoi(argv[2]);
  f[2]=atoi(argv[3]);
  f[3]=atoi(argv[4]);
  p(0);
  for(int i=0;i<g_number;++i){
  memcpy(tmp,fs[i],sizeof(float)*4);
  RES[0]=tmp[0];
  for(int t=0;t<4;++t){ printf("%d,",(int)tmp[t]); }
  printf("
");
  solve(0);
  }
  printf("Found no solution :(
");
  return 0;
  }

  ----------编译运行,运行时的参数就是4个数字
  g++ p.cpp && ./a.out 1 5 5 5
  1,5,5,5,
  Found solution,RES=-24.000000,((1/5)-5)*5
  g++ p.cpp && ./a.out 8 3 3 8
  8,3,3,8,
  Found solution,RES=-24.000006,((8/3)-3)|8
  上面这个解写出来就是
  8
  --------- = 24
  3-(8/3)
  主程序为了简化,省去了对输入的检查,楼主可以自己添加。

#include
using namespace std;
struct operation
{
int x;
int y;
int o;
}op[3];
bool co=false;
void g(int a[],int b[],int n,int i,int j)
{
int x,y;
for(x=0,y=1;x<n;x++)
{
if(x==i||x==j)continue;
b[y++]=a[x];
}
op[4-n].x=a[i];
op[4-n].y=a[j];
}
void f(int a[],int n)
{
int i,j,t,b[4];
if(n==1&&a[0]==24)co=true;
for(i=0;i<n-1;i++)
{
for(j=i+1;j<n;j++)
{
for(t=1;t<=6;t++)
{
switch(t)
{
case 1:g(a,b,n,i,j);
b[0]=a[i]+a[j];
op[4-n].o=t;
f(b,n-1);
if(co)return;
break;
case 2:g(a,b,n,i,j);
b[0]=a[i]-a[j];
op[4-n].o=t;
f(b,n-1);
if(co)return;
break;
case 3:g(a,b,n,i,j);
b[0]=a[i]*a[j];
op[4-n].o=t;
f(b,n-1);
if(co)return;
break;
case 4:
if(a[j]!=0&&a[i]%a[j]==0)
{
g(a,b,n,i,j);
b[0]=a[i]/a[j];
op[4-n].o=t;
f(b,n-1);
if(co)return;
}
break;
case 5:g(a,b,n,i,j);
b[0]=a[j]-a[i];
op[4-n].o=t;
f(b,n-1);
if(co)return;
break;
case 6:
if(a[i]!=0&&a[j]%a[i]==0&&a[j]>a[i])
{
g(a,b,n,i,j);
b[0]=a[j]/a[i];
op[4-n].o=t;
f(b,n-1);
if(co)return;
}
break;
}
}
}
}
}
void h(int a[],int n,int x,int y,int h)
{
int i,j,b[4];
bool bx=false,by=false;
for(i=0,j=0;i<n;i++)
{
if(a[i]==x&&bx==false)
{
bx=true;
continue;
}
if(a[i]==y&&by==false)
{
by=true;
continue;
}
b[j++]=a[i];
}
for(i=0;i<n-1;i++)a[i+1]=b[i];
a[0]=h;
}
void main()
{
int a[4],i,j;
cout<<"输入4个整数:";
for(i=0;i>a[i];
f(a,4);
if(co)
{
for(i=0;i<3;i++)
{
for(j=0;j<4-i;j++)cout<<a[j]<<" ";
cout<<"
运算 ";
switch(op[i].o)
{
case 1:cout<<op[i].x<<"+"<<op[i].y<<endl;
h(a,4-i,op[i].x,op[i].y,op[i].x+op[i].y);
break;
case 2:cout<<op[i].x<<"-"<<op[i].y<<endl;
h(a,4-i,op[i].x,op[i].y,op[i].x-op[i].y);
break;
case 3:cout<<op[i].x<<"*"<<op[i].y<<endl;
h(a,4-i,op[i].x,op[i].y,op[i].x*op[i].y);
break;
case 4:cout<<op[i].x<<"/"<<op[i].y<<endl;
h(a,4-i,op[i].x,op[i].y,op[i].x/op[i].y);
break;
case 5:cout<<op[i].y<<"-"<<op[i].x<<endl;
h(a,4-i,op[i].x,op[i].y,op[i].y-op[i].x);
break;
case 6:cout<<op[i].y<<"/"<<op[i].x<<endl;
h(a,4-i,op[i].x,op[i].y,op[i].y/op[i].x);
break;
}
}
cout<<"24"<<endl;
}
else cout<<"不能算出24"<<endl;
}

#include <stdio.h>

#include <stdlib.h>

#include <math.h>

char op[3], o[5]="+-*/";

float n[4], on[10];

int used[4] = {0}, top=0, tp=0, x;

void chk(float k);

void search24(int d);

float calc(float n1, float n2, char o);

void make(int i, float p, float q, char o, int d);

int main( void )

{

 printf("please input 4 card number:
");

    scanf("%f%f%f%f", &n[0], &n[1], &n[2], &n[3]);

    search24(0);

    printf("No answer.
");

    return 0;

}


void chk(float k)

{

    if( (tp != 3) || ( fabs(k-24.0) > 0.000001 )) //没有用完3个运算符或者结果不为24就退出.

  return;

    for(x=0; x<5; x+=2)                                            //这样设计是为了使3个选中的符号都可以得到输出.

        printf("%g%c%g=%g
", on[x], op[x/2], on[x+1],         //分析得到的.

                               calc(on[x], on[x+1], op[x/2]));

 system("pause");

    exit(0);

}

float calc(float n1, float n2, char o)

{

    switch(o){

        case '+': return (n1+n2);

        case '-': return (n1-n2);

        case '*': return (n1*n2);

        case '/': return (n1/n2);

  default: exit(0);

    }

}

void make(int i, float p, float q, char o, int d)

{

    if(fabs(q)>0.000001 || o!='/')   //除数不为0,或者为0的时候不能为除数.

        n[i] = calc(p, q, o);

    op[tp++] = o; 

 chk(n[i]);

    search24(d+1);

 tp--;    //因为是全是全局变量,所以在做试验性的循环递归问题时,如果失败,要在递归函数后面重新恢复回原来的值

}

void search24(int d)

{

    int i, j, k;

    float p, q;

    if(d>=3)    //控制递归深度,就是运算符的输出个数.

  return;

    for(i=0; i<4; i++)

        for(j=0; j<4; j++)

            if( (i!=j)&& (used[i]+used[j] == 0) ) //i!=j是防止重复,(used[i]+used[j] == 0)是防止又再匹配已经用过的j,

                                      //但是i可以新来.

   {

                used[j] = 1;   //j得到匹配之后,赋值为1,表示已经使用

    p=n[i];

    q=n[j];

                on[top++] = p;

    on[top++] = q;

                for(k=0; k<4; k++)  //运算符的循环试用.

                    make(i, p, q, o[k], d);

                n[i] = p;        //因为是全是全局变量,所以在做试验性的循环递归问题时,

    used[j] = 0;     //如果失败,要在递归函数后面重新恢复回原来的值

                top -= 2;        //

            }

}

出处:http://blog.sina.com.cn/s/blog_491de9d60100d5er.html



关注次问题


C语言程序 算24点
if(n==1&&a[0]==24)co=true;for(i=0;i<n-1;i++){ for(j=i+1;j<n;j++){ for(t=1;t<=6;t++){ switch(t){ case 1:g(a,b,n,i,j);b[0]=a[i]+a[j];op[4-n].o=t;f(b,n-1);if(co)return;break;case 2:g(a,b,n,i,j);b[0]=a[i]-a[j];op[...

求助大神!c语言算24点,要求在图片里,谢谢!
default:break;}}char symbol(int n) \/\/根据n判断当前使用的运算符;{switch (n){case 0:return '+';case 1:return '-';case 2:return '*';case 3:return '\/';default:break;}}float Calculate(char *& ch) \/\/用来计算用户的表达式,每计算一次则将指针前移一个字符;{float num...

C语言24点的算法?
下面是我自己写的一个程序:我的解法是把这个问题分解成了两个子问题,首先求出4个数字的无重复全排列,放到一个数组里面,再对没一个排列情况,从头到尾穷举所有的四则运算情况。注意到除法是特殊的,我用x\/y表示x除以y,用x|y表示x分之y。注意到,如果穷举的解得到-24的话,只需要把有减法的...

C语言24点游戏
include <stdio.h> include <math.h> double num[4];\/\/存储4个数字 double pre = 1E-6; \/\/精度 int go(int n){ int i,j;if(n==1){ if(fabs(num[0]-24)<1E-6)return 1;else return 0;} else { for(i=0;i<n-1;i++){ double a=num[i];double b=num[i+1];for(...

如何用C语言做一个24点游戏的程序?
4.如果玩家认为这四张牌算不出24点,可只输入?,程序将判断这四张牌是否能得出24点,如果能,则程序将给出算式,如果不能,说明不能,并回到1.5当用户正确输入算式后,用“堆栈来求表达式的值”的原理求出结果并判断是否为24,得出用户是输是赢的结果。6.询问用户是否继续,是则回到1,否则结束程序。请在明天晚上10:...

用c语言编写,关于24点的程序
if(tem3==24.0)printf("{(%d%c%d)%c%d}%c%d=24\\n",save[i],sign[n],save[j],sign[m],save[k],sign[r],save[l]);else if(tem3==-24.0)printf("{%d%c(%d%c%d)}%c%d=24\\n",save[k],sign[m],save[i],sign[n],save[j],sign[r],save[l]);else if(tem3==1....

关于24点的C语言代码,能直接使用的,注释最好多一点,以便理解
char operdata[24][4] = {{0,1,2,3},{0,1,3,2},{0,2,1,3},{0,2,3,1},{0,3,1,2},{0,3,2,1},\/*操作数的24种不同排列*\/ {1,0,2,3},{1,0,3,2},{1,2,0,3},{1,2,3,0},{1,3,0,2},{1,3,2,0},{2,1,0,3},{2,1,3,0},{2,0,1,3},{2...

24点 C语言程序
if(tem3==24.0) {printf("{(%d%c%d)%c%d}%c%d=24\\n",save[i],sign[n],save[j],sign[m],save[k],sign[r],save[l]);return;} else if(tem3==-24.0) {printf("{%d%c(%d%c%d)}%c%d=24\\n",save[k],sign[m],save[i],sign[n],save[j],sign[r],save[l]);...

24点游戏C语言编程。要求 游戏给出4个1-13的整数 用户输入一个含这4...
for (p[1]=1;p[1]<=4;p[1]++) if (b[4][24]!=4)for (p[2]=1;p[2]<=4;p[2]++) if ((p[1]!=p[2]) && (b[4][24]!=4))for (p[3]=1;p[3]<=4;p[3]++) if ((p[1]!=p[3]) && (p[2]!=p[3]) && (b[4][24]!=4)){ p[4]=10-p[1]-p...

C语言实训求:编程实现24点游戏算法
include<iostream> include<math.h> using namespace std;const double MIN=1E-6;void Print(int *Rank,double *FourNum){ for(int i=0;i<4;i++)cout<<FourNum[Rank[i]]<<" ";cout<<endl;} void Calculate_24(int *Rank,int *FourNum,char *Oper,int i,int j,int k,bool &def...

遂昌县19824759279: C语言24点的算法? -
盈泼补肾: 把随机生成的四个数放到数组里,判断加起来等于24就好;参考代码如下:#include #include #include #define LING 1E-6#define CONT 4#define VOLUE 24 float number[CONT]; char expression[CONT][20] ; bool m_judge = false; //判断是否有...

遂昌县19824759279: 用c语言编写,关于24点的程序 -
盈泼补肾: #include<stdio.h> double fun(double a1,double a2,int b) //加减乘除的函数 {switch(b) {case 0:return (a1+a2); case 1:return (a1-a2); case 2:return (a1*a2); case 3:return (a1/a2); } } void main() {int i,j,k,l,n,m,r,save[4],flg=1; double num[4]={1,1,1,1},tem1,...

遂昌县19824759279: 如何用C语言编程"输入4个数,通过加减乘除计算出24,显示计算过程,并提示成功信息." -
盈泼补肾: #include "stdlib.h" #include "stdio.h" #include "string.h" typedef struct D_NODE {int data;struct D_NODE *left,*right; } NODE24; NODE24 head;int res=24;int maketree(int *src,int *i, NODE24 *p) {int d=src[*i];(*i)++;switch (d)...

遂昌县19824759279: 计算24点 要求:用C语言编写,输入4个数,通过加减乘除计算出24点,显示计算过程,并提示成功信息. -
盈泼补肾: /* Note:Your choice is C IDE */#include "stdio.h"#include "stdlib.h"#include "ctype.h"#include "string.h"#include "math.h" typedef float dd[5]; dd a; //输入的4个数 dd b; //4个数计算后剩余的3个数 dd c; //3个数计算后剩余的2个数 int ...

遂昌县19824759279: 24点游戏用c语言怎么写?? -
盈泼补肾: 你首先要懂得C语言编写规则,其次了解24点游戏的玩法及规则,然后就可以选择一个合适的编译器,开始编写24点游戏了

遂昌县19824759279: 如何用C语言实现24点运算 -
盈泼补肾: 我有c++的#include<iostream>#include<string> using namespace std; const double Threshold=1E-6; const int CardsNumber=4; const int ResultValue=24; double number[CardsNumber]; string result[CardsNumber]; bool PointsGame(int n) { if(n==1)...

遂昌县19824759279: 设计C语言程序 计算24点题目要求在输入4个数后,程序对这个4个数进行运算,若能计算出结果等于24,输出运算 -
盈泼补肾: #include <stdio.h> #include <string.h> int c24; char expr3[80]; char expr4[80]; void count2( int a, int b ) {if ( a + b == 24 ){c24 ++;printf( "%s\t%s\t%d+%d=24\n", expr4, expr3, a, b );}if ( a * b == 24 ){c24 ++;printf( "%s\t%s\t%d+%d=24\n...

遂昌县19824759279: 10,10,10,10怎么算24点 -
盈泼补肾:[答案] (10++)+(10++)+【(10++)-(10--)】 =11+11+(11-9) =22+2 =24 C语言 log10 应该是符号 log根号10 也是符号 log根号10 (10)=2 所以 log根号10 (10)+log根号10 (10)+10+10

遂昌县19824759279: 24点c语言源代码 -
盈泼补肾: #include"math.h" int total=0,count=0,page; char temp; main(){float sum(float,float,char);void test24(float [],char []);int i,j,k,l,q,r,s,t,n=0;float a[4];char f[4]={'+','-','*','/'};float x[4];char y[3];int go=1;while(go==1){printf("Please input how many ...

遂昌县19824759279: 跪求C语言高手怎么用C语言来实现24点(我只要思想(详细点我很苯),不要答案)谢谢了 -
盈泼补肾: 用4个变量a,b,c,d分别从1到9嵌套循环.用3个变量op1,op2,op3分别用1到4来代表+,-,*,/嵌套循环.在4个数中间带3个运算符,括号可以任意加的情况下,分析各种类型式子的本质,可以发现有许多算式在本质上是相同的,最终可以将算式类型分成5类,具体是哪5类我忘了,网上有文章写到过的.在数和运算符的嵌套循环中再对5类式子循环代入计算,相当于用穷举法找结果,但最终找到的结果其实还有不少是本质上相同的.

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网