24点问题的解法

24点问题的解法,第1张

1、4÷[﹙3-2﹚÷6]

2、﹙6×3﹚+﹙4+2﹚

3、[﹙4÷2﹚+6]×3

4、2+[﹙3×6﹚+4]

5、4×[﹙6÷2﹚+3]

6、[6×﹙3-2﹚]×4

7、﹙2+4﹚+﹙6×3﹚

8、2+[4+﹙6×3﹚]

9、[﹙6×3﹚+2]+4

10、﹙6×3﹚+﹙2+4﹚

扩展资料:

利用计算程序来完成这个计算二十四点的程序

方法如下:

首先穷举的可行性问题。把表达式如下分成三类--

1、 无括号的简单表达式。

2、 有一个括号的简单表达式。

3、 有两个括号的较复杂表达式。

在栈中,元素的插入称为压入(push)或入栈,元素的删除称为d出(pop)或退栈。

栈的基本运算有三种,其中包括入栈运算、退栈运算以及读栈顶元素,这些请参考相关数据结构资料。根据这些基本运算就可以用数组模拟出栈来。

参考资料:24点——百度百科

#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:\n")

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

  search24(0)

  printf("No answer.\n")

  return 0

}

void chk(float k)

{

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

return

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

      printf("%g%c%g=%g\n", 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=0i<4i++)

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

          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=0k<4k++)  //运算符的循环试用.

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

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

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

              top -= 2       //

          }

}

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


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/yw/11887636.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-19
下一篇 2023-05-19

发表评论

登录后才能评论

评论列表(0条)

保存