ペンの質問/ C ++ - 24点のゲームアルゴリズム

24点のゲームアルゴリズム

問題のI.説明

给出4个1-10的数字,通过加减乘除,得到数字为24就算胜利
输入:
4个1-10的数字。[数字允许重复,但每个数字仅允许使用一次,测试用例保证无异常数字]
输出:
true or false

第二のアイデアは解決しました:

前記演算記号、我々は置換する関数ポインタを使用して、対応するバインディングモードに応じて、異なる周期を取って達成しました。

別館:ソース

#include <iostream>
#include <vector>
using namespace std;

//24点游戏算法:
//穷举



double add(double a, double b) {
	return a + b;
}
double min(double a, double b) {
	return a - b;
}
double mul(double a, double b) {
	return a * b;
}
double div(double a, double b) {
	if (b == 0) {
		return -10000;
	}
	return a / b;
}

bool get24Pointabcd(double a, double b, double c, double d) {
	double(*choice[4])(double, double) = { add, min, mul, div };
	double sum = 0;
	for (int i = 0; i < 4; ++i) {
		sum = choice[i](a, b);
		if (sum - -10000 < 0.0001) {
			continue;
		}
		double tmp1 = sum;
		for (int j = 0; j < 4; ++j) {
			tmp1 = choice[j](tmp1, c);
			if (tmp1 - -10000 < 0.0001) {
				continue;
			}
			double tmp2 = tmp1;
			for (int k = 0; k < 4; ++k) {
				tmp2 = choice[k](tmp2, d);
				if (tmp2 == 24) {
					return true;
				}
				tmp2 = tmp1;
			}
			tmp1 = sum;
		}
	}
	return false;
}



bool get24Pointab_cd(double a, double b, double c, double d) {
	double(*choice[4])(double, double) = { add, min, mul, div };
	double sum = 0;
	double sum2 = 0;
	for (int i = 0; i < 4; ++i) {
		sum = choice[i](a, b);
		if (sum - -10000 < 0.0001) {
			continue;
		}
		for (int j = 0; j < 4; ++j) {
			sum2 = choice[j](c, d);
			if (sum2 - -10000 < 0.0001) {
				continue;
			}
			for (int k = 0; k < 4; ++k) {
				if ((choice[k](sum, sum2)) == 24) {
					return true;
				}
			}
		}
	}
	return false;
}



bool get24Pointa_bc_d(double a, double b, double c, double d) {
	double(*choice[4])(double, double) = { add, min, mul, div };
	double sum = 0;
	double sum2 = 0;
	for (int i = 0; i < 4; ++i) {
		sum2 = choice[i](b, c);
		if (sum2 - -10000 < 0.0001) {
			continue;
		}
		for (int j = 0; j < 4; ++j) {
			sum = choice[j](a, sum2);
			if (sum - -10000 < 0.0001) {
				continue;
			}
			double tmp1 = sum;
			for (int k = 0; k < 4; ++k) {
				tmp1 = choice[k](tmp1, d);
				if (tmp1 == 24) {
					return true;
				}
				tmp1 = sum;
			}
		}
	}
	return false;
}


bool get24Pointa_bcd(double a, double b, double c, double d) {
	double(*choice[4])(double, double) = { add, min, mul, div };
	double sum = 0;
	double sum2 = 0;
	for (int i = 0; i < 4; ++i) {
		sum2 = choice[i](b, c);
		if (sum2 - -10000 < 0.0001) {
			continue;
		}
		double tmp = sum2;
		for (int j = 0; j < 4; ++j) {
			tmp = choice[j](tmp, d);
			if (tmp - -10000 < 0.0001) {
				continue;
			}
			for (int k = 0; k < 4; ++k) {
				sum = choice[k](a, tmp);
				if (sum == 24) {
					return true;
				}
				sum = tmp;
			}
			tmp = sum2;
		}
	}
	return false;
}


void test(double a, double b, double c, double d) {
	vector<double> num;
	num.resize(4);
		num[0] = a; num[1] = b; num[2] = c; num[3] = d;
		for (int i = 0; i < 4; ++i) {
			for (int j = 0; j < 4; ++j) {
				for (int k = 0; k < 4; ++k) {
					for (int m = 0; m < 4; ++m) {
						if (i == j || i == k || i == m || j == k || j == m || k == m) {
							continue;
						}
						if (get24Pointabcd(num[i], num[j], num[k], num[m]) ||
							get24Pointab_cd(num[i], num[j], num[k], num[m]) ||
							get24Pointa_bc_d(num[i], num[j], num[k], num[m]) ||
							get24Pointa_bcd(num[i], num[j], num[k], num[m])
							) {
							cout << "true" << endl;
							return;
						}
					}
				}
			}
		}
		cout << "false" << endl;
		return;
}


int main() {
	double a, b, c, d;
	while (cin >> a >> b >> c >> d) {
		test(a, b, c, d);
	}
	return 0;
}

 

 

 

公開された58元の記事 ウォン称賛43 ビュー4347

おすすめ

転載: blog.csdn.net/Wz_still_shuai/article/details/104620913