24点游戏题库算法分析
目录
一、4数种类分析
二、四数排列算法分析
三、分数计算类
四、加减乘除操作符遍历
五、探测4个数是否能计算24
六、源码地址
一、4数种类分析
统计分析
从标有1-10的数字的10个小球中取出1个小球记录小球的数字,然后将小球放回,如此反复4次取出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. 如果不存在就添加到列表中。
遍历所有的数据。
#define MAXNUM 10
QList<struNum> initList()
{QList<struNum> list;for (int i1 = 1;i1 <= MAXNUM; i1++) {for (int i2 = 1;i2 <= MAXNUM; i2++) {for (int i3 = 1;i3 <= MAXNUM; i3++) {for (int i4 = 1;i4 <= MAXNUM; i4++) {struNum num(i1,i2,i3,i4);if(!isInList(num,list)){list.append(num);}}}}}return list;
}
判断是否存在列表中
typedef struct SNUM{SNUM(int num1,int num2,int num3,int num4){this->num1 = num1;this->num2 = num2;this->num3 = num3;this->num4 = num4;}int num1 =0;int num2 =0;int num3 =0;int num4 =0;int c = 0; // 四个数能够计算24算法。
}struNum;
bool isInList(struNum num, QList<struNum> list)
{int numList[4] = {num.num1,num.num2,num.num3,num.num4};bool result = false;for (int i1 = 0 ; i1 < 4; i1 ++) {for (int i2 = 0 ; i2 < 4; i2 ++){if(i1 == i2) continue;for (int i3 = 0 ; i3 < 4; i3 ++){if(i2 == i3 || i1 == i3) continue;for (int i4 = 0 ; i4 < 4; i4 ++){if(i1 == i4 || i2 == i4 || i3 == i4) continue;foreach(auto item ,list){if(item.num1 == numList[i1]&& item.num2 == numList[i2]&& item.num3 == numList[i3]&& item.num4 == numList[i4]){result = true;}}}}}}return result;
}
二、四数排列算法分析
4个数按照顺序排列,一共有多少种排列方法。
我们可以使用遍历方法,将所有的数字进行遍历,那么可以得到一下算法。可以看到以下算法的步骤需要经过4*4*4*4 次运算。那么我们通过观察可以优化代码算法。
优化前
4*4*4*4 = 256次运算
int numList[4] = {num1,num2,num3,num4};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 ++){if(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,num4};int c =0;for (int i1 = 0 ; i1 < 4; i1 ++) {for (int i2 = 0 ; i2 < 4; i2 ++){if(i1 == i2) continue;for (int i3 = 0 ; i3 < 4; i3 ++){if(i2 == i3 || i1 == i3) continue;for (int i4 = 0 ; i4 < 4; i4 ++){if(i1 == i4 || i2 == i4 || i3 == i4) continue;qInfo()<<numList[i1]<<" "<<numList[i2] <<" "<< numList[i3] <<" "<<" "<< numList[i4];c++;}}}}
三、分数计算类
由于计算过程中可能会遇到分数计算,因此我们不能使用int类型直接表示数据,或者是数据运算结果,我们定义一个分数类,专门用来计算分数的,加、减、乘、除,这样可以尽可能保存数据的正确性。
加法
减法
乘法
除法
LNum.h
#ifndef LNUM_H
#define LNUM_Hclass LNum
{public:LNum(int Molecule);LNum(int Molecule,int Denominator);int getMolecule(); // 获取分子int getDenominator(); // 获取分母void setMolecule(int molecule); // 设置分子void setDenominator(int denominator);// 设置分母double data();LNum operator + ( LNum p1);LNum operator - ( LNum p1);LNum operator * ( LNum p1);LNum operator / ( LNum p1);bool operator ==( LNum p1) ;
private:// 分子int m_iMolecule = 1;// 分母int m_iDenominator = 1;void Equivalency(); // 约分};#endif // LNUM_H
LNum.cpp
#include "lnum.h"LNum::LNum(int num):m_iMolecule(num),m_iDenominator(1)
{}LNum::LNum(int Molecule, int Denominator):m_iMolecule(Molecule),m_iDenominator(Denominator)
{}int LNum::getMolecule()
{Equivalency();return m_iMolecule;
}int LNum::getDenominator()
{Equivalency();return m_iDenominator;
}void LNum::setMolecule(int molecule)
{m_iMolecule = molecule;
}void LNum::setDenominator(int denominator)
{m_iDenominator = denominator;
}double LNum::data()
{Equivalency();if(m_iDenominator == 1){return m_iMolecule;}return double(m_iMolecule)/double(m_iDenominator);
}void LNum::Equivalency()
{int num = m_iMolecule> m_iDenominator?m_iDenominator:m_iMolecule;for (int i = 2 ; i < num ;i++) {if(m_iDenominator%i == 0 && m_iMolecule%i ==0){m_iDenominator = m_iDenominator/i;m_iMolecule = m_iMolecule/i;num = m_iMolecule> m_iDenominator?m_iDenominator:m_iMolecule;}}
}LNum LNum::operator +(LNum p1)
{LNum res(getMolecule(),getDenominator());res.setMolecule(getMolecule()*p1.getDenominator() + getDenominator()*p1.getMolecule());res.setDenominator(getDenominator()*p1.getDenominator());return res;
}LNum LNum::operator -(LNum p1)
{LNum res(getMolecule(),getDenominator());res.setMolecule(getMolecule()*p1.getDenominator() - getDenominator()*p1.getMolecule());res.setDenominator(getDenominator()*p1.getDenominator());return res;
}LNum LNum::operator *(LNum p1)
{LNum res(getMolecule(),getDenominator());res.setMolecule(getMolecule()*p1.getMolecule());res.setDenominator(getDenominator()*p1.getDenominator());return res;
}LNum LNum::operator /(LNum p1)
{LNum res(getMolecule(),getDenominator());res.setMolecule(getMolecule()*p1.getDenominator());res.setDenominator(getDenominator()*p1.getMolecule());return res;
}bool LNum::operator ==(LNum p1)
{if (getMolecule() == p1.getMolecule() && getDenominator() == p1.getDenominator()) {return true;}else{return false;}}
四、加减乘除操作符遍历
第一步将操作符数字化,方便遍历。可以得到如下公式。x为操作符标识。
double jisuan(LNum num1,LNum num2,int x){switch (x) {case 0:return num1+num2;case 1:return num1-num2 ;case 2:return num1*num2;case 3:return num1/num2 ;}return 0;
}
五、探测4个数是否能计算24
循环遍历4个数的不同位置,并且循环遍历算法。判断其内容是否为24如果是24那么表示可以计算成功。
int is24OK(LNum num1, LNum num2, LNum num3, LNum num4)
{int result = 0;QList<struRecordNum> list;LNum numList[4] = {num1,num2,num3,num4};// 交换4个数字的顺序。for (int i1 = 0 ; i1 < 4; i1 ++) {for (int i2 = 0 ; i2 < 4; i2 ++){if(i1 == i2) continue;for (int i3 = 0 ; i3 < 4; i3 ++){if(i2 == i3 || i1 == i3) continue;for (int i4 = 0 ; i4 < 4; i4 ++){if(i1 == i4 || i2 == i4 || i3 == i4) continue;// qInfo()<<numList[i1]<<" "<<numList[i2] <<" "<< numList[i3] <<" "<<" "<< numList[i4];int x=suanfatongji(numList[i1],numList[i2],numList[i3],numList[i4],&list);if(x !=0){qInfo()<<"x:"<<x;result += x;}}}}}return result;
}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 = jisuan(jisuan(jisuan (num1,num2,i1),num3,i2),num4,i3) ;if(24.0 == sum.data()){// 是否找到相同的算法,因为有重复数字可能导致算法想法和数字相同的情况。bool result = false;for(auto item : *list){if(item.num1 == static_cast<int>(num1.data())&& item.num2 == static_cast<int>(num2.data())&& item.num3 == static_cast<int>(num3.data())&& item.num4 == static_cast<int>(num4.data())&& item.option1 == i1&& item.option2 == i2&& item.option3 == i3){result = true;}}if(!result){struRecordNum tmpItem;tmpItem.num1 = static_cast<int>(num1.data());tmpItem.num2 = static_cast<int>(num2.data());tmpItem.num3 = static_cast<int>(num3.data());tmpItem.num4 = static_cast<int>(num4.data());tmpItem.option1 = i1;tmpItem.option2 = i2;tmpItem.option3 = i3;list->append(tmpItem);c++;qInfo()<< "(( "<< num1.data() <<strOption(i1) << num2.data() <<")"<<strOption(i2)<< num3.data()<<")" <<strOption(i3)<< num4.data();}}}}}return c;
}
六、源码地址
啊渊 / QT博客案例 · GitCode 24点题库分析。
24点游戏题库算法分析相关推荐
- 24点游戏python编程代码和运行结果_编程实现24点游戏,我发现自己总是输是有原因的...
你有玩过24点游戏吗? 两个人轮流从一副扑克牌(不包含鬼牌)中抽牌至有四张手牌为止,利用四张牌上的数字通过加减乘除运算先得出24点的玩家获胜. 一.24点游戏有解的概率 细想一下24点的规则可以发现, ...
- Java黑皮书课后题第3章:**3.24(游戏:抽牌)编写程序,模拟从一副52张的牌中抽一张牌,程序应显示牌的大小、花色
**3.24(游戏:抽牌)编写程序,模拟从一副52张的牌中抽一张牌,程序应显示牌的大小.花色 题目 题目概述 运行示例 破题 代码 题目 题目概述 **3.24(游戏:抽牌)编写程序,模拟从一副52张 ...
- 1000道Python题库系列分享24(41个客观题,numpy专题)
封面图片:<Python程序设计基础(第2版)>,董付国,清华大学出版社 ============== 好消息:智慧树网APP"知到"中搜索"董付国" ...
- 视频教程-算法设计与编算法设计与编程实践---基于leetcode的企业真题库程实践-C/C++
算法设计与编算法设计与编程实践---基于leetcode的企业真题库程实践 夏曹俊:南京捷帝科技有限公司创始人,南京大学计算机硕士毕业,有15年c++跨平台项目研发的经验,领导开发过大量的c++虚拟仿 ...
- python编程狮app题库_Python编程狮-零基础学Python im App Store
Python编程狮是W3Cschool编程狮旗下专门为零基础Python编程爱好者打造的一款入门工具App,致力于帮助初学者入门,轻松迈入编程世界.学Python,从这里开始! [零基础也能学]初学者 ...
- c语言编程房屋中介系统,房地产经纪人优题库app下载-房地产经纪人优题库app安卓版下载v4.6.0 - 非凡软件站...
现在考房地产经纪人的小伙伴也很多,想要更好地学习知识,充分利用闲暇时间,一款好用的手机软件是必不可少的,今天小编就给大家带来一款好用的房地产经纪人学习软件--房地产经纪人优题库,这款软件内有海量题库. ...
- python编程狮题库答案_Python编程狮-零基础学Python dans l’App Store
Python编程狮是W3Cschool编程狮旗下专门为零基础Python编程爱好者打造的一款入门工具App,致力于帮助初学者入门,轻松迈入编程世界.学Python,从这里开始! [零基础也能学]初学者 ...
- 5导出word_重磅更新 !支持题库导出为word
重磅更新 本次更新如下: 1 支持题库导出为docx文档 2 支持思维导图源文件导出到邮箱 3 新增积分系统(试用) 2020年02月24日 更新说明 2020年 02 月 24 日 随着我编程技 ...
- python编程狮app题库_Python编程狮-零基础学Python App Storessa
Python编程狮是W3Cschool编程狮旗下专门为零基础Python编程爱好者打造的一款入门工具App,致力于帮助初学者入门,轻松迈入编程世界.学Python,从这里开始! [零基础也能学]初学者 ...
最新文章
- [JS] 题解:提取不重复的整数
- mysql innodb 数据复制_五千万的数据 复制到另张表 是先复制数据再加索引还是先建好索引再复制数据 表引擎Innodb...
- python输出所有组合数_生成两个列表的所有组合,并在python中一一输出
- linux 自学系列:wc命令
- 第一行代码:以太坊(1)-创建自己的私有区块链
- android studio 65536错误的解决
- 【OpenJ_Bailian - 2711 】 合唱队形(dp,枚举中间顶点)
- MySQL 添加列 修改列 删除列
- linux远程连接命令有哪些,linux系统远程连接命令有哪些
- zebradesginer zpl代码,如何从ZebraDesigner标签获取ZPL代码?
- 转 爬虫与反爬虫套路
- 2018noip模拟 烷基
- 微信小程序周报(第十二期)-极乐小程序商店出品
- ApacheCon Asia 2022 启动,7 场阿里云大数据 +AI 议题分享等你围观
- python第四次作业——陈灵院
- 火车硬座车厢座位分布表
- 腾讯——云计算从业者认证系列1
- 12000+star的GANSynth,音乐与AI的完美结合
- 在电视中使用计算机动画最多的是,计算机动画技术在科教类电视节目中的应用探究...
- Auto CAD:CAD三维建模设计之常用工具(实体、曲面、网格)之详细攻略