24点游戏算法(c语言实现)
时间: 2023-05-08 09:02:00 浏览: 405
24点游戏是一种非常有趣的数学游戏,它可以极大地锻炼我们的大脑思维能力,并且也可以培养我们的团队协作精神。当然,除了玩游戏,我们也可以通过实现24点游戏算法,来学习和巩固C语言代码编写的能力。
24点游戏算法的实现主要包含以下几个步骤:
1. 生成所有4个数字的排列组合,并存储在数组中。
2. 对于所有的排列组合,分别进行四则运算,并计算出结果。
3. 判断计算出的结果是否等于24,如果等于,则输出该组合。
4. 如果没有任何一组排列组合的计算结果等于24,则输出“无解”。
下面是C语言实现的代码:
#include <stdio.h>
#include <stdlib.h>
int main()
{
int a, b, c, d; //4个数字
int i, j, k;
int count = 0; //计数器
printf("请输入4个数字(1 ~ 13):\n");
scanf("%d %d %d %d", &a, &b, &c, &d);
int arr[4] = {a, b, c, d}; //将4个数字存储在数组中
int op[3]; //运算符数组,长度为3,分别代表两个运算符和括号
for (i = 0; i < 4; i++) {
for (j = 0; j < 4; j++) {
if (j == i) continue;
for (k = 0; k < 4; k++) {
if (k == i || k == j) continue;
op[0] = op[1] = op[2] = -1; //初始化
op[2] = 0; //括号位置
calculate(arr[i], arr[j], arr[k], arr[6-i-j-k], op, &count);
}
}
}
if (count == 0) {
printf("无解!\n");
}
return 0;
}
void calculate(int a, int b, int c, int d, int op[], int *count) {
int result;
if (op[0] != -1) {
if (op[2] == 0) {
int tmp1 = calculate2(a, b, op[0]);
result = calculate2(tmp1, c, op[1]);
result = calculate2(result, d, op[2]);
if (result == 24) {
printf("%d %c %d %c %d %c %d = 24\n", a, get_operator(op[0]), b, get_operator(op[1]), c, get_operator(op[2]), d);
(*count)++;
}
return;
}
else {
int tmp1 = calculate2(a, b, op[0]);
int tmp2 = calculate2(c, d, op[1]);
result = calculate2(tmp1, tmp2, op[2]);
if (result == 24) {
printf("(%d %c %d) %c (%d %c %d) = 24\n", a, get_operator(op[0]), b, get_operator(op[2]), c, get_operator(op[1]), d);
(*count)++;
}
return;
}
}
else {
calculate(a, b, c, d, &op[0], count);
calculate(a, b, d, c, &op[0], count);
calculate(a, c, b, d, &op[0], count);
calculate(a, c, d, b, &op[0], count);
calculate(a, d, b, c, &op[0], count);
calculate(a, d, c, b, &op[0], count);
calculate(b, a, c, d, &op[0], count);
calculate(b, a, d, c, &op[0], count);
calculate(b, c, a, d, &op[0], count);
calculate(b, c, d, a, &op[0], count);
calculate(b, d, a, c, &op[0], count);
calculate(b, d, c, a, &op[0], count);
calculate(c, a, b, d, &op[0], count);
calculate(c, a, d, b, &op[0], count);
calculate(c, b, a, d, &op[0], count);
calculate(c, b, d, a, &op[0], count);
calculate(c, d, a, b, &op[0], count);
calculate(c, d, b, a, &op[0], count);
calculate(d, a, b, c, &op[0], count);
calculate(d, a, c, b, &op[0], count);
calculate(d, b, a, c, &op[0], count);
calculate(d, b, c, a, &op[0], count);
calculate(d, c, a, b, &op[0], count);
calculate(d, c, b, a, &op[0], count);
}
}
int calculate2(int a, int b, int op) {
switch (op) {
case 0: return a + b;
case 1: return a - b;
case 2: return a * b;
case 3: return a / b;
}
return 0;
}
char get_operator(int op) {
switch (op) {
case 0: return '+';
case 1: return '-';
case 2: return '*';
case 3: return '/';
}
return '?';
}
在上面的代码中,calculate函数是算法的核心部分,它采用递归的方式生成所有的排列组合,并调用calculate2函数进行四则运算。calculate2函数接受两个数字和运算符,根据运算符进行运算并返回运算结果。get_operator函数用于将运算符转化为字符表示,方便输出。运行完程序后,输出得到的结果,最后如果没有任何一组排列组合的计算结果等于24,则输出“无解”。