⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 24dlgdlg.cpp

📁 这是一个算24点的程序 里面的算法很值得学习
💻 CPP
📖 第 1 页 / 共 2 页
字号:
					iNumMaths[6][1]=eNumber;


					for (int oneOP = eAdd; oneOP <= eDiv; oneOP++)
					{
						for (int twoOP=eAdd; twoOP<=eDiv; twoOP++)
						{
							for (int threeOP=eAdd; threeOP<=eDiv; threeOP++)
							{
								iNumMaths[1][0] = oneOP;
								iNumMaths[1][1] = eOperator;
								iNumMaths[3][0] = twoOP;
								iNumMaths[3][1] = eOperator;
								iNumMaths[5][0] = threeOP;
								iNumMaths[5][1] = eOperator;
								double dRes = CalcOneExpress(iNumMaths, 7);

								if(Equal24(dRes))
								{
									CombineResult(iNumMaths, 7, strResult);
									return TRUE;
								}
							}
						}
					}//end for (int oneOP
                }
            }
        }
    }	
	return FALSE;
}

int iNumExp = 0;
//计算有括号的
BOOL CalcArray2(int iNumInput[], CString& strResult)
{
	// (a * b) * c * d	//9 number
	iNumExp = 9;
	
	int iNumMaths[11][2];
	iNumMaths[0][0] = eLeftParen;
	iNumMaths[0][1] = eOperator;
	iNumMaths[4][0] = eRightParen;
	iNumMaths[4][1] = eOperator;

    for(int i=0;i<4;i++)
    {
        for(int j=0;j<4;j++)    
        {
            if(j==i)
            {
                continue;
            }
            for(int k=0;k<4;k++)
            {
                if(k==i||k==j)
                {
                    continue;
                }
                for(int l=0;l<4;l++)
                {
                    if(l==i||l==j||l==k)
                    {
                        continue;
                    }
                    iNumMaths[1][0]=iNumInput[i];
                    iNumMaths[3][0]=iNumInput[j];
                    iNumMaths[6][0]=iNumInput[k];
                    iNumMaths[8][0]=iNumInput[l];

					iNumMaths[1][1]=eNumber;
					iNumMaths[3][1]=eNumber;
					iNumMaths[6][1]=eNumber;
					iNumMaths[8][1]=eNumber;


					for (int oneOP = eAdd; oneOP <= eDiv; oneOP++)
					{
						for (int twoOP=eAdd; twoOP<=eDiv; twoOP++)
						{
							for (int threeOP=eAdd; threeOP<=eDiv; threeOP++)
							{
								iNumMaths[2][0] = oneOP;
								iNumMaths[2][1] = eOperator;
								iNumMaths[5][0] = twoOP;
								iNumMaths[5][1] = eOperator;
								iNumMaths[7][0] = threeOP;
								iNumMaths[7][1] = eOperator;
								double dRes = CalcOneExpress(iNumMaths, iNumExp);

								if(Equal24(dRes))
								{
									CombineResult(iNumMaths, iNumExp, strResult);
									return TRUE;
								}
							}
						}
					}//end for (int oneOP
                }
            }
        }
    }	
	return FALSE;
}

//计算有括号的
BOOL CalcArray3(int iNumInput[], CString& strResult)
{
	// (a * b * c) * d	//9 number
	int iNumMaths[11][2];
	iNumMaths[0][0] = eLeftParen;
	iNumMaths[0][1] = eOperator;
	iNumMaths[6][0] = eRightParen;
	iNumMaths[6][1] = eOperator;

    for(int i=0;i<4;i++)
    {
        for(int j=0;j<4;j++)    
        {
            if(j==i)
            {
                continue;
            }
            for(int k=0;k<4;k++)
            {
                if(k==i||k==j)
                {
                    continue;
                }
                for(int l=0;l<4;l++)
                {
                    if(l==i||l==j||l==k)
                    {
                        continue;
                    }
                    iNumMaths[1][0]=iNumInput[i];
                    iNumMaths[3][0]=iNumInput[j];
                    iNumMaths[5][0]=iNumInput[k];
                    iNumMaths[8][0]=iNumInput[l];

					iNumMaths[1][1]=eNumber;
					iNumMaths[3][1]=eNumber;
					iNumMaths[5][1]=eNumber;
					iNumMaths[8][1]=eNumber;


					for (int oneOP = eAdd; oneOP <= eDiv; oneOP++)
					{
						for (int twoOP=eAdd; twoOP<=eDiv; twoOP++)
						{
							for (int threeOP=eAdd; threeOP<=eDiv; threeOP++)
							{
								iNumMaths[2][0] = oneOP;
								iNumMaths[2][1] = eOperator;
								iNumMaths[4][0] = twoOP;
								iNumMaths[4][1] = eOperator;
								iNumMaths[7][0] = threeOP;
								iNumMaths[7][1] = eOperator;
								double dRes = CalcOneExpress(iNumMaths, 9);

								if(Equal24(dRes))
								{
									CombineResult(iNumMaths, 9, strResult);
									return TRUE;
								}
							}
						}
					}//end for (int oneOP
                }
            }
        }
    }	
	return FALSE;
}


//计算有括号的
BOOL CalcArray4(int iNumInput[], CString& strResult)
{
	// a * (b * c) * d	//9 number
	int iNumMaths[11][2];
	iNumMaths[2][0] = eLeftParen;
	iNumMaths[2][1] = eOperator;
	iNumMaths[6][0] = eRightParen;
	iNumMaths[6][1] = eOperator;

    for(int i=0;i<4;i++)
    {
        for(int j=0;j<4;j++)    
        {
            if(j==i)
            {
                continue;
            }
            for(int k=0;k<4;k++)
            {
                if(k==i||k==j)
                {
                    continue;
                }
                for(int l=0;l<4;l++)
                {
                    if(l==i||l==j||l==k)
                    {
                        continue;
                    }
                    iNumMaths[0][0]=iNumInput[i];
                    iNumMaths[3][0]=iNumInput[j];
                    iNumMaths[5][0]=iNumInput[k];
                    iNumMaths[8][0]=iNumInput[l];

					iNumMaths[0][1]=eNumber;
					iNumMaths[3][1]=eNumber;
					iNumMaths[5][1]=eNumber;
					iNumMaths[8][1]=eNumber;


					for (int oneOP = eAdd; oneOP <= eDiv; oneOP++)
					{
						for (int twoOP=eAdd; twoOP<=eDiv; twoOP++)
						{
							for (int threeOP=eAdd; threeOP<=eDiv; threeOP++)
							{
								iNumMaths[1][0] = oneOP;
								iNumMaths[1][1] = eOperator;
								iNumMaths[4][0] = twoOP;
								iNumMaths[4][1] = eOperator;
								iNumMaths[7][0] = threeOP;
								iNumMaths[7][1] = eOperator;
								double dRes = CalcOneExpress(iNumMaths, 9);

								if(Equal24(dRes))
								{
									CombineResult(iNumMaths, 9, strResult);
									return TRUE;
								}
							}
						}
					}//end for (int oneOP
                }
            }
        }
    }	
	return FALSE;
}


//计算有括号的
BOOL CalcArray5(int iNumInput[], CString& strResult)
{
	// (a * b) * (c * d)	//11 number
	int iNumMaths[11][2];
	iNumMaths[0][0] = eLeftParen;
	iNumMaths[0][1] = eOperator;
	iNumMaths[4][0] = eRightParen;
	iNumMaths[4][1] = eOperator;
	iNumMaths[6][0] = eLeftParen;
	iNumMaths[6][1] = eOperator;
	iNumMaths[10][0] = eRightParen;
	iNumMaths[10][1] = eOperator;

    for(int i=0;i<4;i++)
    {
        for(int j=0;j<4;j++)    
        {
            if(j==i)
            {
                continue;
            }
            for(int k=0;k<4;k++)
            {
                if(k==i||k==j)
                {
                    continue;
                }
                for(int l=0;l<4;l++)
                {
                    if(l==i||l==j||l==k)
                    {
                        continue;
                    }
                    iNumMaths[1][0]=iNumInput[i];
                    iNumMaths[3][0]=iNumInput[j];
                    iNumMaths[7][0]=iNumInput[k];
                    iNumMaths[9][0]=iNumInput[l];

					iNumMaths[1][1]=eNumber;
					iNumMaths[3][1]=eNumber;
					iNumMaths[7][1]=eNumber;
					iNumMaths[9][1]=eNumber;


					for (int oneOP = eAdd; oneOP <= eDiv; oneOP++)
					{
						for (int twoOP=eAdd; twoOP<=eDiv; twoOP++)
						{
							for (int threeOP=eAdd; threeOP<=eDiv; threeOP++)
							{
								iNumMaths[2][0] = oneOP;
								iNumMaths[2][1] = eOperator;
								iNumMaths[5][0] = twoOP;
								iNumMaths[5][1] = eOperator;
								iNumMaths[8][0] = threeOP;
								iNumMaths[8][1] = eOperator;
								double dRes = CalcOneExpress(iNumMaths, 11);

								if(Equal24(dRes))
								{
									CombineResult(iNumMaths, 11, strResult);
									return TRUE;
								}
							}
						}
					}//end for (int oneOP
                }
            }
        }
    }	
	return FALSE;
}

//计算有括号的
BOOL CalcArray6(int iNumInput[], CString& strResult)
{
	// ((a * b) * c) * d	//11 number
	int iNumMaths[11][2];
	iNumMaths[0][0] = eLeftParen;
	iNumMaths[0][1] = eOperator;
	iNumMaths[1][0] = eLeftParen;
	iNumMaths[1][1] = eOperator;
	iNumMaths[5][0] = eRightParen;
	iNumMaths[5][1] = eOperator;
	iNumMaths[8][0] = eRightParen;
	iNumMaths[8][1] = eOperator;

    for(int i=0;i<4;i++)
    {
        for(int j=0;j<4;j++)    
        {
            if(j==i)
            {
                continue;
            }
            for(int k=0;k<4;k++)
            {
                if(k==i||k==j)
                {
                    continue;
                }
                for(int l=0;l<4;l++)
                {
                    if(l==i||l==j||l==k)
                    {
                        continue;
                    }
                    iNumMaths[2][0]=iNumInput[i];
                    iNumMaths[4][0]=iNumInput[j];
                    iNumMaths[7][0]=iNumInput[k];
                    iNumMaths[10][0]=iNumInput[l];

					iNumMaths[2][1]=eNumber;
					iNumMaths[4][1]=eNumber;
					iNumMaths[7][1]=eNumber;
					iNumMaths[10][1]=eNumber;


					for (int oneOP = eAdd; oneOP <= eDiv; oneOP++)
					{
						for (int twoOP=eAdd; twoOP<=eDiv; twoOP++)
						{
							for (int threeOP=eAdd; threeOP<=eDiv; threeOP++)
							{
								iNumMaths[3][0] = oneOP;
								iNumMaths[3][1] = eOperator;
								iNumMaths[6][0] = twoOP;
								iNumMaths[6][1] = eOperator;
								iNumMaths[9][0] = threeOP;
								iNumMaths[9][1] = eOperator;
								double dRes = CalcOneExpress(iNumMaths, 11);

								if(Equal24(dRes))
								{
									CombineResult(iNumMaths, 11, strResult);
									return TRUE;
								}
							}
						}
					}//end for (int oneOP
                }
            }
        }
    }		
	return FALSE;
}

//计算有括号的
BOOL CalcArray7(int iNumInput[], CString& strResult)
{
	// (a * (b * c)) * d	//11 number
	int iNumMaths[11][2];
	iNumMaths[0][0] = eLeftParen;
	iNumMaths[0][1] = eOperator;
	iNumMaths[3][0] = eLeftParen;
	iNumMaths[3][1] = eOperator;
	iNumMaths[7][0] = eRightParen;
	iNumMaths[7][1] = eOperator;
	iNumMaths[8][0] = eRightParen;
	iNumMaths[8][1] = eOperator;

    for(int i=0;i<4;i++)
    {
        for(int j=0;j<4;j++)    
        {
            if(j==i)
            {
                continue;
            }
            for(int k=0;k<4;k++)
            {
                if(k==i||k==j)
                {
                    continue;
                }
                for(int l=0;l<4;l++)
                {
                    if(l==i||l==j||l==k)
                    {
                        continue;
                    }
                    iNumMaths[1][0]=iNumInput[i];
                    iNumMaths[4][0]=iNumInput[j];
                    iNumMaths[6][0]=iNumInput[k];
                    iNumMaths[10][0]=iNumInput[l];

					iNumMaths[1][1]=eNumber;
					iNumMaths[4][1]=eNumber;
					iNumMaths[6][1]=eNumber;
					iNumMaths[10][1]=eNumber;


					for (int oneOP = eAdd; oneOP <= eDiv; oneOP++)
					{
						for (int twoOP=eAdd; twoOP<=eDiv; twoOP++)
						{
							for (int threeOP=eAdd; threeOP<=eDiv; threeOP++)
							{
								iNumMaths[2][0] = oneOP;
								iNumMaths[2][1] = eOperator;
								iNumMaths[5][0] = twoOP;
								iNumMaths[5][1] = eOperator;
								iNumMaths[9][0] = threeOP;
								iNumMaths[9][1] = eOperator;
								double dRes = CalcOneExpress(iNumMaths, 11);

								if(Equal24(dRes))
								{
									CombineResult(iNumMaths, 11, strResult);
									return TRUE;
								}
							}
						}
					}//end for (int oneOP
                }
            }
        }
    }	
	return FALSE;
}

//Calculate 24 points
BOOL Calc24(int iNum1, int iNum2, int iNum3, int iNum4, CString& strResult)
{
	//括号的几种情况
	//1	无括号
	//2 (a b) c d		同a b (c d), 下省略
	//3 (a b c) d
	//4 a (b c) d
	//5 (a b) (c d)
	//6 ((a b) c) d
	//7 (a (b c)) d

	//计算不含括号的情况
	int iNumArr[4];
	iNumArr[0] = iNum1;
	iNumArr[1] = iNum2;
	iNumArr[2] = iNum3;
	iNumArr[3] = iNum4;

	if (CalcArray1(iNumArr, strResult))
	{
		return TRUE;
	}

	if (CalcArray2(iNumArr, strResult))
	{
		return TRUE;
	}

	if (CalcArray3(iNumArr, strResult))
	{
		return TRUE;
	}

	if (CalcArray4(iNumArr, strResult))
	{
		return TRUE;
	}

	if (CalcArray5(iNumArr, strResult))
	{
		return TRUE;
	}

	if (CalcArray6(iNumArr, strResult))
	{
		return TRUE;
	}

	if (CalcArray7(iNumArr, strResult))
	{
		return TRUE;
	}

	return FALSE;
}



void CMy24DlgDlg::OnButton2() 
{
	UpdateData();		
	if(!Calc24(m_iNum1, m_iNum2, m_iNum3, m_iNum4, m_strResult))
	{
		m_strResult = "These number cannot be combined to 24";
	}

	UpdateData(FALSE);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -