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的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。