首先上传界面结果:
然后附上算法代码:
1 void CMy24pointgameDlg::OnEnChangeEdit4() 2 { 3 // TODO: 如果该控件是 RICHEDIT 控件,则它将不会 4 // 发送该通知,除非重写 CDialog::OnInitDialog() 5 // 函数并调用 CRichEditCtrl().SetEventMask(), 6 // 同时将 ENM_CHANGE 标志“或”运算到掩码中。 7 8 // TODO: 在此添加控件通知处理程序代码 9 m_WndButton.EnableWindow(TRUE); //输入第四个数字时,计算按钮变为可按 10 } 11 12 void CMy24pointgameDlg::Count24PointGame(void) 13 { 14 15 16 UpdateData(TRUE); 17 18 m_iWndNum1 = m_iWndNum1 % 10; 19 m_iWndNum2 = m_iWndNum2 % 10; 20 m_iWndNum3 = m_iWndNum3 % 10; 21 m_iWndNum4 = m_iWndNum4 % 10; 22 23 dVec.push_back(m_iWndNum1); 24 dVec.push_back(m_iWndNum2); 25 dVec.push_back(m_iWndNum3); 26 dVec.push_back(m_iWndNum4); 27 28 CString temp; 29 temp.Format(L"%d",m_iWndNum1); 30 sVec.push_back(temp); 31 temp.Format(L"%d",m_iWndNum2); 32 sVec.push_back(temp); 33 temp.Format(L"%d",m_iWndNum3); 34 sVec.push_back(temp); 35 temp.Format(L"%d",m_iWndNum4); 36 sVec.push_back(temp); 37 38 if (!Search24Point(COUNT_OF_NUMBER)) 39 { 40 m_WndResult += L"Fail."; 41 } 42 else 43 { 44 m_WndResult = L""; 45 int c = 0; 46 for (vector<CString>::iterator it = sResult.begin(); it != sResult.end(); it++) 47 { 48 CString temp; 49 temp = *it; 50 c++; 51 if (c == 3) 52 { 53 temp += " "; 54 c = 0; 55 } 56 else 57 temp += " "; 58 m_WndResult += temp; 59 } 60 } 61 62 dVec.clear(); 63 sVec.clear(); 64 65 m_cResult.SetSel(0,-1); 66 m_cResult.ReplaceSel(m_WndResult); 67 68 UpdateData(FALSE); 69 } 70 71 bool CMy24pointgameDlg::Search24Point(int n) 72 { 73 if (n == 1) 74 { 75 if (dVec.front() - NUMBER_TO_BE_CAL == 0) 76 { 77 CString temp; 78 temp = sVec.front(); 79 temp += " = 24"; 80 sResult.push_back(temp); 81 return TRUE; 82 } 83 else 84 return FALSE; 85 } 86 for (int i = 0; i < n; i++) 87 { 88 for (int j = i + 1; j < n ; j++) 89 { 90 double a,b; 91 CString s1,s2; 92 93 a = dVec[i]; // 保存起来,在方法最后再恢复,以便继续计算 94 b = dVec[j]; // 保存起来,在方法最后再恢复,以便继续计算 95 dVec[j] = dVec[n - 1]; // 将最后一个数挪过来 96 97 s1 = sVec[i]; // 保存起来,在方法最后再恢复,以便继续计算 98 s2 = sVec[j]; // 保存起来,在方法最后再恢复,以便继续计算 99 sVec[j] = sVec[n - 1]; // 将最后一个式子挪过来j' 100 101 // 看看加法能否算出,如果能算出,返回true 102 sVec[i] = '(' + s1 + '+' + s2 + ')'; 103 dVec[i] = a + b; 104 if (Search24Point(n -1)) 105 { 106 return TRUE; 107 } 108 109 // 看看减法能否算 110 sVec[i] = '(' + s1 + '-' + s2 + ')'; 111 dVec[i] = a - b; 112 if (Search24Point(n - 1)) 113 { 114 return TRUE; 115 } 116 117 sVec[i] = '(' + s2 + '-' + s1 + ')'; 118 dVec[i] = b - a; 119 if (Search24Point(n - 1)) 120 { 121 return TRUE; 122 } 123 124 // 看看乘法能否算 125 sVec[i] = '(' + s1 + '*' + s2 + ')'; 126 dVec[i] = a * b; 127 if (Search24Point(n - 1)) 128 { 129 return TRUE; 130 } 131 132 // 看看除法能否算 133 if (b != 0) 134 { 135 sVec[i] = '(' + s1 + '/' + s2 + ')'; 136 dVec[i] = a / b; 137 if (Search24Point(n - 1)) 138 { 139 return TRUE; 140 } 141 } 142 143 if (a != 0) 144 { 145 sVec[i] = '(' + s2 + '/' + s1 + ')'; 146 dVec[i] = b / a; 147 if (Search24Point(n - 1)) 148 { 149 return TRUE; 150 } 151 } 152 //如果以上的加、减、乘、除都不能得到有效的结果,则恢复数据进行下一轮的计算。 153 dVec[i] = a; 154 dVec[j] = b; 155 sVec[i] = s1; 156 sVec[j] = s2; 157 } 158 } 159 return false; 160 }