自娱自乐~经典24点游戏

首先上传界面结果:

然后附上算法代码:

  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 }
原文地址:https://www.cnblogs.com/SamRichard/p/3677727.html