这个程序实现了24点游戏,但是最后的输出有问题,好多重复的计算方法,比如,5+1+2和5+3就是两个不同的答案 代码如下,#include <iostream> #include <string> #include <vector> #include <set> #include <fstream> #include <sstream> using namespace std; float r[6][6]; bool found; set<string> answer; void mySwap(float &a, float &b) { float t; t = a; a = b; b = t; } void outanswer() { ostringstream msg; for(int i = 1; i <= 3; i++) { switch(int(r[i][2])) { case 1: msg << r[i][1] << "+" << r[i][3]; break; case 2: msg << r[i][1] << "-" << r[i][3]; break; case 3: msg << r[i][1] << "*" << r[i][3]; break; case 4: msg << r[i][1] << "/" << r[i][3]; break; case 5: msg << r[i][3] << "/" << r[i][1]; break; } msg << "=" << r[i][4] << ";"; } string ans = msg.str(); if(answer.find(ans) == answer.end()) answer.insert(ans); } void mySearch(int k, vector<float> d) { int i,j,m,t; float a,b; vector<float> e(5,0); if( k == 1) { if(int((d[1]-24) * 100000 )== 0) {outanswer(); found = true; } } else { for(i = 1; i <= k-1; i++) for(j = i+1; j <= k; j++) { a = d[i]; b = d[j]; if(a < b) mySwap(a,b); for(m = 1, t = 0; m <= k; m++) if((m != i) && (m != j)) e[++t] = d[m]; r[5-k][1] = a; r[5-k][3] = b; r[5-k][4] = -1; for(m = 1; m <= 5; m++) { switch(m) { case 1: r[5-k][4] = a + b; break; case 2: r[5-k][4] = a - b; break; case 3: r[5-k][4] = a * b; break; case 4: if(b != 0) r[5-k][4] = a/b; break; case 5: if(a != 0) r[5-k][4] = b/a; break; } r[5-k][2] = m; if(r[5-k][4] != -1) { e[t+1] = r[5-k][4]; mySearch(k-1,e); } } } } } int main() { vector<float> d(5); for(int i = 1; i <= 4; i++) cin >> d[i]; found = false; mySearch(4,d); for(set<string>::iterator it = answer.begin(); it != answer.end();it++) cout << *it << endl; if(!found) cout << "No answer!" << endl; system("pause"); return 0; }