24点游戏是我们经常玩的一种游戏,这种游戏规则简单,但是有时候却非常考验我们的大脑,今天通过c++代码写了一个计算4张牌是否可以组成24点的程序:
#include<iostream>
using namespace std;
const char sign[4] = {'+', '-', '*', '/'};
bool is24 = false; //记录是否可以组成24点
void isTF(float a[], int len) {
if (len == 1) {
if (a[0] > 23.9999 && a[0] < 24.0001) {
is24 = true;
}
return;
}
for (int i=0; i<len; i++) {
for (int j=0; j<len; j++) {
if (j == i) {
continue;
}
//使用不用的组合来实现
for (int k=0; k<4; k++) {
float t[len - 1];
char b1[20];
if (sign[k] == '+') {
t[0] = a[i] + a[j];
} else if (sign[k] == '-') {
t[0] = a[i] - a[j];
} else if (sign[k] == '*') {
t[0] = a[i] * a[j];
} else if (sign[k] == '/') {
t[0] = a[i] / a[j];
} else {
break;
}
int n = 1;
for (int m=0; m<len; m++) {
if (m != i && m != j) {
t[n++] = a[m];
}
}
//递归调用
isTF(t, len-1);
}
}
}
}
int main() {
float t[4];
while (cin>>t[0]>>t[1]>>t[2]>>t[3]) {
bool is_ok = true;
for (int i=0; i<4; i++) {
if (t[i] <= 0 || t[i] > 13) {
is_ok = false;
break;
}
}
if (!is_ok) {
cout<<"输入的数字不合法,请输入1-13之间的数字"<<endl;
continue;
}
isTF(t, 4);
if (is24) {
cout<<"可以组成24点"<<endl;
is24 = false;
} else {
cout<<"不能组成24点"<<endl;
}
}
return 0;
}
原则上就是使用递归 + 遍历 来实现的。程序很简单。至于效率在目前这么几个数还是可以接受的。