0
点赞
收藏
分享

微信扫一扫

24点递归实现(c语言)

陬者 2022-03-30 阅读 115

一、 24点规则介绍

        24点是棋牌类益智游戏,要求四个数字通过加、减、乘、除运算,最终结果等于二十四。下面要求编写一个程序,随意输入四个数,能够判断这4个数是否能计算出24点。

二、 递归算法原理

        由于用循环穷举4个数的排列组合的方法时间复杂度较高,所以想到了递归。四个数的运算必定有两个数先进行运算,那么剩下的相当于是两个未运算的数与一个运算结果,可以看成是从四个数任意个数进行运算变成了三个数任意挑两个数进行运算。这就实现了递归的其中一步,迭代之后只剩下一个数时就是某一种运算的结果。但是这只是一种运算,本算法采用深度优先搜索算法进行穷举。下面是算法流程

  1. 在四个数遍历选两个数;
  2. 通过递归计算该组合在此运算符下的结果;
  3. 如果运算结果是24则退出循环输出 y,如果不是则继续进行深度优先搜索

三、下面是C语言代码

#include <stdio.h>

double ys(double a, double b, int n) {
	double c;
	if (n == 1)
		c = a * b;
	if (n == 2)
		c = a / b;
	if (n == 3)
		c = a + b;
	if (n == 4)
		c = a - b;
	if (n == 5)
		c = b - a;
	if (n == 6)
		c = b / a;
	return c;
}

bool guiyi(double a[], int n) {
	int i, b, c, k;
	double t[4];
	if (n == 1) {
		if (a[0] == 24)
			return true;
		else
			return false;
	}
	for (i = 1; i < 7; i++) {
		for (b = 0; b < n - 1; b++) {
			for (c = b + 1; c < n; c++) {
				int f = 0;
				for (k = 0; k < n; k++) {
					if (a[k] != a[b] && a[k] != a[c]) {
						t[f] = a[k];
						f++;
					}
				}
				t[f] = ys(a[b], a[c], i);
				if (guiyi(t, n - 1))
					return true;
			}
		}
	}
	return false;
}

int main() {
	double  a[4];
	scanf("%lf %lf %lf %lf", &a[0], &a[1], &a[2], &a[3]);
	if (guiyi(a, 4))
		printf("y");
	else
		printf("n");
}
举报

相关推荐

0 条评论