24点游戏c++,穷举法

采用的是穷举法,所以有点麻烦
关键是在于这个点
他有五种情况下的运算方式
加减乘除就没有加进去了
//(AB)(CD)
//(A(BC))D
//((AB)C)D
//A(B(CD))
//A((BC)D)
计算了一下一共大概有 :
3^3(三个运算符)*5(五种括号运算情况)*4!(4的阶层中数字摆放顺序)

ps:在进行运算的时候己得顺序不能反
因为运算的函数是确定的,如果换顺序会错误
eg: r1=haha( a , s ,op1)!= r1=haha( s , a ,op1)

下面是代码的实现,里面可能有一些对不上

#include <stdio.h>

#include <iostream>
using namespace std;
const char lala[5] = { '@','+','-','*','/', };

double haha(double x, double y, int asd)//这里是对应加减乘除
{
	switch (asd)
	{
	case 1:
		return x + y;
	case 2:
		return x - y;
	case 3:
		return x * y;
	case 4:
		return x / y;
	default:
		return 0.0;
	}
}

//这里写的是对应不同的模板
//((as)d)f
double yi(double a, double s, double d, double f, int op1, int op2, int op3)
{
	double r1, r2, r3;
	r1 = haha(a, s, op1);
	r2 = haha(r1, d, op2);
	r3 = haha(r2, f, op3);
	return r3;
}
//(A(BC))D
double er(double a, double s, double d, double f, int op1, int op2, int op3)
{
	//1111111
	double r1, r2, r3;
	r1 = haha(s, d, op2);
	r2 = haha(a, r1, op1);
	r3 = haha(r2, f, op3);
	return r3;
}
//A(B(CD)).
double san(double a, double s, double d, double f, int op1, int op2, int op3)
{
	double r1, r2, r3;
	r1 = haha(d, f, op3);
	r2 = haha(s, r1, op2);
	r3 = haha(a, r2, op1);
	return r3;
}
//a((sd)f)
double si(double a, double s, double d, double f, int op1, int op2, int op3)
{
	double r1, r2, r3;
	r1 = haha(s, d, op2);
	r2 = haha(r1, f, op3);
	r3 = haha(a, r2, op1);
	return r3;
}
//(as)(df)
double wu(double a, double s, double d, double f, int op1, int op2, int op3)
{
	double r1, r2, r3;
	//(AB)(CD)
	//meiyouwenti
	r1 = haha(a, s, op1);
	r2 = haha(d, f, op3);
	r3 = haha(r1, r2, op2);
	return r3;
}

double get24(double a, double s, double d, double f)
{
	int flag = 0;
	for (int i = 1; i <= 4; ++i)//三重循环穷举运算符
	{
		for (int j = 1; j <= 4; ++j)
		{
			for (int k = 1; k <= 4; ++k)
			{
				if (yi(a, s, d, f, i, j, k) == 24.0)
				{
					//((as)d)f
					printf("((%.0f%c%.0f)%c%.0f)%c%.0f=24\n", a, lala[i], s, lala[j], d, lala[k], f);
					flag = 1;
					return flag;
				}
				if (er(a, s, d, f, i, j, k) == 24.0)
				{
					//(A(BC))D
					printf("(%.0f%c(%.0f%c%.0f))%c%.0f=24\n", a, lala[i], s, lala[j], d, lala[k], f);
					flag = 1;
					return flag;
				}
				if (san(a, s, d, f, i, j, k) == 24.0)
				{
					//A(B(CD)).
					printf("%.0f%c(%.0f%c(%.0f%c%.0f))=24\n", a, lala[i], s, lala[j], d, lala[k], f);
					flag = 1;
					return flag;
				}
				if (si(a, s, d, f, i, j, k) == 24.0)
				{
					//a((sd)f)
					printf("(%.0f%c((%.0f%c%.0f)%c%.0f)=24\n", a, lala[i], s, lala[j], d, lala[k], f);
					flag = 1;
					return flag;
				}

				if (wu(a, s, d, f, i, j, k) == 24.0)
				{
					//(as)(df)
					printf("(%.0f%c%.0f)%c(%.0f%c%.0f)=24\n", a, lala[i], s, lala[j], d, lala[k], f);
					flag = 1;
					return flag;
				}
			}
		}
	}
	return flag;
}


int main()
{
	double sz[5];
	double x=0;
	while (true)
	{
		x = 0;
		cin >> sz[1] >> sz[2] >> sz[3] >> sz[4];
		//scanf("%lf%lf%lf%lf", &sz[1], &sz[2], &sz[3], &sz[4]);
		for (int i = 1; i <= 4; i++)//穷举运算数组的全排列
		{
			for (int j = 1; j <= 4; j++)
			{
				if (j != i)
					for (int k = 1; k <= 4; k++)
					{
						if (k != j && k != i)
							for (int l = 1; l <= 4; l++)
							{
								if (l != k && l != j && l != i)
								{
									x= get24(sz[i], sz[j], sz[k], sz[l]);
									if (x == 1)
										break;
								}
									
							}
						if (x == 1)
							break;
					}
				if (x == 1)
					break;
			}
			if (x == 1)
				break;
		}
	}
	
	return 0;
}

这个是强行算出来的没有上面很大的意义,更多的是细节

要在C++中运行这段代码,你需要在开头加上以下头文件引用和命名空间声明: ```cpp #include <iostream> #include <vector> using namespace std; ``` 同时,你需要在主函数中调用`Nqueen`函数,如下所示: ```cpp int main() { int n; cin >> n; Solution s; cout << s.Nqueen(n) << endl; return 0; } ``` 这段代码的运行结果是:运行时间为30ms,超过了52.49%的C++提交的代码;占用内存为404KB,超过了47.41%的C++提交的代码。 通过观察代码,可以得出结论:这段代码是通过迭代实现回溯来求解N皇后问题的。首先,需要判断当前棋盘上的某个位置是否可以放置皇后。然后,从第一列开始遍历,尝试将皇后放置在每一列上,如果可以放置,则递归地继续放置下一行的皇后。当所有皇后都被放置在棋盘上时,计数器加一。最后,返回计数器的值作为结果。 综上所述,这段代码使用了穷举法来解决N皇后问题。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [法第一篇:N皇后问题的回溯解法 C++实现](https://blog.csdn.net/DooDia/article/details/114814913)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值