24点游戏题库算法分析图,24点游戏题库算法分析答案

  24点游戏题库算法分析图,24点游戏题库算法分析答案

  Yyds干货库存

  第一,四种分析

  统计分析

  从标有数字1到10的10个球中取出1个球,记下球的号码,然后把球放回去。四次取出4个球的号码有多少种序列号?注:1.1.8.9和1.8.1.9是一类。

  需要分为以下几种情况:

  四个数量相等的球:一个球有10种。

  三个球的数量相等:有10*9种=90。

  当两个球的数目相等而另外两个球的数目不相等时,总共有10 * (9 * 8 /2)种=360。

  10表示:10个相等的球。

  (9 * 8 /2)表示:另外两个球不相等。

  两个球的数量相等,另外两个球也相等。总共(10*9)/2=45

  不想等四个小球数=10* 9 * 8 * 7/(4 * 3 *2 *1)=210

  总计=10 90 360 45 210=715

  代码分析

  我们可以使用遍历方法直接穷尽代码,

  1.比较记录列表中的数据是否存在,如果存在则忽略。

  2.如果不存在,将其添加到列表中。

  遍历所有数据。

  #定义最大数量10

  QList struNum initList()

  {

  QList结构列表;

  for(int i1=1;i1=MAXNUMi1 ) {

  for(int I2=1;i2=MAXNUMi2 ) {

  for(int i3=1;i3=MAXNUMi3 ) {

  for(int i4=1;i4=MAXNUMi4 ) {

  struNum num(i1,i2,i3,i4);

  如果(!isInList(num,list)){

  list . append(num);

  }

  }

  }

  }

  }

  退货单;

  }

  确定它是否存在于列表中。

  typedef结构SNUM{

  SNUM(整数1,整数2,整数3,整数4){

  this-num 1=num 1;

  this-num 2=num 2;

  this-num 3=num 3;

  this-num 4=num 4;

  }

  int num 1=0;

  int num 2=0;

  int num 3=0;

  int num 4=0;

  int c=0;//四个数可以算出24的算法。

  } struNum

  bool isInList(结构编号,QList结构编号列表)

  {

  int numList[4]={num.num1,num.num2,num.num3,num . num 4 };

  bool result=false

  for(int i1=0;i1 4;i1 ) {

  for(int I2=0;I2 4;i2 ){

  if(i1==i2)继续;

  for(int i3=0;i3 4;i3 ){

  if(i2==i3 i1==i3)继续;

  for(int i4=0;i4 4;i4 ){

  if(i1==i4 i2==i4 i3==i4)继续;

  foreach(自动项目,列表){

  if(item.num1==numList[i1]

  item.num2==numList[i2]

  item.num3==numList[i3]

  item.num4==numList[i4]){

  结果=真;

  }

  }

  }

  }

  }

  }

  返回结果;

  }

  二、四个数排列算法分析四个数按顺序排列,有多少种排列方法。

  我们可以用遍历的方法遍历所有的数,然后就可以得到算法了。可以看出,下面这个算法的步骤需要经过4*4*4*4的运算。然后我们可以通过观察来优化代码算法。

  优化前

  4*4*4*4=256次运算

  int numList[4]={num1,num2,num3,num 4 };

  for(int i1=0;i1 4;i1 ) {

  for(int I2=0;I2 4;i2 ){

  for(int i3=0;i3 4;i3 ){

  for(int i4=0;i4 4;i4 ){

  如果(i1!=i2 i1!=i3 i1!=i4 i2!=i3 i2!=i4 i3!=i4){

  qInfo()numList[i1] numList[I2] numList[i3] numList[i4];

  c;

  }

  }

  }

  }

  }

  优化后

  4*3*2=24次运算。

  int numList[4]={num1,num2,num3,num 4 };

  int c=0;

  for(int i1=0;i1 4;i1 ) {

  for(int I2=0;I2 4;i2 ){

  if(i1==i2)继续;

  for(int i3=0;i3 4;i3 ){

  if(i2==i3 i1==i3)继续;

  for(int i4=0;i4 4;i4 ){

  if(i1==i4 i2==i4 i3==i4)继续;

  qInfo()numList[i1] numList[I2] numList[i3] numList[i4];

  c;

  }

  }

  }

  }假设数字是1-4,绳结如下:

  共24种。

  三。分数计算类因为在计算过程中可能会遇到分数计算,所以我们不能用int类型直接表示数据,或者数据运算的结果。我们定义一个小数类,专门用来计算分数,比如加减乘除,尽可能的保留数据的正确性。

  添加

  减法

  增加

  分开

  LNum.h

  #ifndef LNUM_H

  #定义LNUM_H

  LNum级

  {

  公共:

  LNum(int分子);

  LNum(int分子,int分母);

  int get molecule();//获取分子

  int get denominator();//获取分母

  void setMolecule(int分子);//设置分子

  void set denominator(int denominator);//设置分母

  double data();

  LNum运算符(LNum P1);

  LNum运算符-(LNum P1);

  发行数量运算符*(因努姆P1);

  发行数量运算符/(伊努姆P1);

  弯曲件运算符==(LNum P1);

  私人:

  //分子

  int m _ I分子=1;

  //分母

  int m _ iDenominator=1;

  空的当量();//约分

  };

  #endif //LNUM_H

  LNum.cpp

  #包含" lnum.h "

  LNum:LNum(整数)

  :m_iMolecule(数字)

  ,m_iDenominator(1)

  {

  }

  LNum:LNum(整数分子,整数分母)

  :分子(分子)

  ,m_iDenominator(分母)

  {

  }

  int LNum:getMolecule()

  {

  当量();

  返回m _分子

  }

  int LNum:getDenominator()

  {

  当量();

  返回m _ iDenominator

  }

  void LNum:set molecule(int molecule)

  {

  m_iMolecule=分子;

  }

  void LNum:设置分母(int denominator)

  {

  m_iDenominator=分母;

  }

  double LNum:data()

  {

  当量();

  if(m_iDenominator==1){

  返回m _分子

  }

  return double(m _ I分子)/double(m _ iDenominator);

  }

  void LNum:equivalence()

  {

  int num=m _ I分子m _ iDenominator?m _ iDenominator:m _ I分子;

  for(int I=2;i numi ) {

  if(m _ iDenominator % I==0m _ I molecule % I==0){

  m _ iDenominator=m _ iDenominator/I;

  m _ I分子=m _ I分子/I;

  num=m_iMolecule m_iDenominator?m _ iDenominator:m _ I分子;

  }

  }

  }

  伊娜姆伊娜姆:运算符(最小p1)

  {

  LNum res(getMolecule()、get分母());

  RES . set molecule(get molecule()* P1。get分母()get分母()* P1。get分子());

  RES . set分母(get分母()* P1。get分母());

  返回表示留数

  }

  伊娜姆伊娜姆:运算符-(最小p1)

  {

  LNum res(getMolecule()、get分母());

  RES . set molecule(get molecule()* P1。获取分母()-获取分母()* P1。get分子());

  RES . set分母(get分母()* P1。get分母());

  返回表示留数

  }

  伊娜姆伊娜姆:运算符*(最小p1)

  {

  LNum res(getMolecule()、get分母());

  RES . set molecule(get molecule()* P1。get分子());

  RES . set分母(get分母()* P1。get分母());

  返回表示留数

  }

  伊娜姆伊娜姆:运算符/(最小值p1)

  {

  LNum res(getMolecule()、get分母());

  RES . set molecule(get molecule()* P1。get分母());

  RES . set分母(get分母()* P1。get分子());

  返回表示留数

  }

  bool LNum:operator==(LNum p1)

  {

  如果(得到分子()==P1。得到分子()得到分母()==P1。get分母()){

  返回真实的

  }

  否则{

  返回错误的

  }

  }

  四、加减乘除操作符遍历第一步将操作符数字化,方便遍历。可以得到如下公式10 .x为操作符标识。

  双Ji苏曼(数量1,数量2,整数x){

  开关(十){

  案例0:

  返回数字1数字2

  案例1:

  返回num 1-num 2;

  案例二:

  返回数量1 *数量2

  案例三:

  返回数字1/数字2;

  }

  返回0;

  }

  五、探测四个数是否能计算24循环遍历四个数的不同位置,并且循环遍历算法。判断其内容是否为24如果是24那么表示可以计算成功。

  int是24OK(LNum num1、LNum num2、LNum num3、LNum num4)

  {

  int result=0;

  QList struRecordNum列表;

  LNum numList[4]={num1,num2,num3,num 4 };

  //交换四个数字的顺序。

  for(int i1=0;i1 4;i1 ) {

  for(int I2=0;I2 4;i2 ){

  如果(i1==i2)继续;

  for(int i3=0;i3 4;i3 ){

  if(i2==i3 i1==i3)继续;

  for(int i4=0;i4 4;i4 ){

  if(i1==i4 i2==i4 i3==i4)继续;

  //qInfo()numList[i1] numList[I2] numList[i3] numList[i4];

  int x=suanfatongji(numList[i1],numList[i2],numList[i3],numList[i4],list);

  如果(x!=0){

  qInfo() x: x;

  结果=x;

  }

  }

  }

  }

  }

  返回结果;

  }

  int suanfatongji(LNum num1,LNum num2,LNum num3,LNum num4,QList struRecordNum *list)

  {

  LNum sum=0;

  int c=0;

  for(int i1=0;i1 4;i1 ){

  for(int I2=0;I2 4;i2 ){

  for(int i3=0;i3 4;i3 ){

  sum=纪苏曼(纪苏曼(纪苏曼(num 1,num2,i1),num3,i2),num4,i3);

  if(24.0==sum.data()){

  //是否找到相同的算法,因为有重复数字可能导致算法想法和数字相同的情况。

  布尔结果=假

  对于(自动项目:*列表){

  如果(项。num 1==static _ cast int(num 1。data())

  项目。num 2==static _ cast int(num 2。data())

  项目。num 3==static _ cast int(num 3。data())

  项目。num 4==static _ cast int(num 4。data())

  项目。选项1==i1

  item.option2==i2

  item.option3==i3){

  结果=真;

  }

  }

  如果(!结果){

  结构记录数

  tmpitem。数字1=static _ cast int(数字1。data());

  tmpitem。num 2=static _ cast int(num 2。data());

  tmpitem。num 3=static _ cast int(num 3。data());

  tmpitem。num 4=static _ cast int(num 4。data());

  tmpItem.option1=i1

  tmpItem.option2=i2

  tmpItem.option3=i3

  list-append(tmpItem);

  c;

  秦佛()(号1。数据()存储选项(i1)编号2。data()) strOption(I2)num 3。data()) strOption(i3)num 4。data();

  }

  }

  }

  }

  }

  返回c;

  }

  六、源码地址啊渊/QT博客案例GitCode 24点题库分析。

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: