算24点(作弊器)

小时候24点玩你,长大了你玩24点

今天我想试试自己长大了没(并没有),然后就被24点给玩了QWQ。

今天我和我的好盆友,隔壁的dgdger和chengxx大佬一起玩24点(日常不刷题),然后发现高估自己实力了,大部分我们都不会,然后一脸蒙蔽的百度QWQ

因为2个大佬太强了,我一直玩不过他们,玩不过怎么办呢?当然是好好练习开挂啦!

写了个神奇的24点计算器,(开挂真香)后来发现洛谷竟然有这个题,水一波不亏。

抱着侥幸心里去水了一波(亏大发了),然后我就调试了2节课,好在成功AC了,竟然AC了,就来帮帮还没有AC的同学们吧(想玩24点作弊的同学也帮一下)

先看题板:

题目描述
几十年前全世界就流行一种数字游戏,至今仍有人乐此不疲.在中国我们把这种游戏称为“算24点”。您作为游戏者将得到4个1~9之间的自然数作为操作数,而您的任务是对这4个操作数进行适当的算术运算,要求运算结果等于24。
您可以使用的运算只有:+,-,*,/,您还可以使用()来改变运算顺序。注意:所有的中间结果须是整数,所以一些除法运算是不允许的(例如,(2*2)/4是合法的,2*(2/4)是不合法的)。下面我们给出一个游戏的具体例子:
若给出的4个操作数是:1、2、3、7,则一种可能的解答是1+2+3*7=24。
输入格式
只有一行,四个1到9之间的自然数。
输出格式
如果有解的话,只要输出一个解,输出的是三行数据,分别表示运算的步骤。其中第一行是输入的两个数和一个运算符和运算后的结果,第二行是第一行的结果和一个输入的数据、运算符、运算后的结果,或者是另外两个数的输出结果;第三行是前面的结果第二行的结果或者剩下的一个数字、运算符和“=24”。如果两个操作数有大小的话则先输出大的。
如果没有解则输出“No answer!”
如果有多重合法解,输出任意一种即可。
注:所有运算结果均为正整数
输入输出样例
输入 #1 
复制 
1 2 3 7
输出 #1 
复制 
2+1=3
7*3=21
21+3=24

这里面一些很恶心的地方,比如(2个操作数如果有大小先放大的),这不重要,我们先看看这4个数有几种结合方法:

1:((a?b)?c)?d

2:(a?b)?(c?d)

3:(a?(b?c))?d

4:a?(b?(c?d))

5:a?((b?c)?d)

看起来好难弄的样子啊~

(悄悄告诉大家,我们用全排列做,这里面只有1和2有用。写这么多就是吓唬你们的)

STL里有一个敲好用的函数,next_permutation,这个函数可以求出全排列的下一个(好强啊)

我们只要把他写成next_permutation(a+1,a+5)就可以排序4个数字了,有个小地方需要注意,这个函数是把数列只升序排列,比如2 3 4 1是排不完全的,我们想让他排序完所有可能性,就要小小的用一下sort,从小到大排个序,完美。

处理完排列问题了,继续:

运算符也是直接暴力,3重for循环真好,把运算符存到数组里,循环尝试,成功了就输出。嗯,很不错。

具体亿点点小模拟大家可以自行思考(剩下的没啥可思考的了)

代码福利:

#include<iostream>
#include<cstdio>
#include<algorithm> 
using namespace std;
char fh[5]={' ','+','-','*','/'};
long long a[5];
long long js(long long a1,long long a2,long long a3)
{
	if(a3==1)
	{
		return a1+a2;
	}
	else if(a3==2)
	{
		return max(a1,a2)-min(a1,a2);
	}
	else if(a3==3)
	{
		return a1*a2;
	}
	else if(a3==4)
	{ 
		if(a2==0)//注意,要先判断a2是否等于0,如果a2等于0的话,a1%a2这个语句会直接崩掉。
		{
			return -999;
		}
		if(a1%a2!=0||a1<a2)
		{
			return -999;
		}
		else
		{
			return a1/a2;
		}
	}
}
void f()
{
	while(next_permutation(a+1,a+4+1))//友善的全排列函数(noip让用,真香)
	{
		for(long long i=1;i<=4;i++)//暴力枚举运算符号
		{
			for(long long j=1;j<=4;j++)
			{
				for(long long k=1;k<=4;k++)
				{
					if(js(js(js(a[1],a[2],i),a[3],j),a[4],k)==24)//简单的亿点点模拟
					{
						cout<<max(a[1],a[2])<<fh[i]<<min(a[1],a[2])<<"="<<js(a[1],a[2],i)<<endl;
						cout<<max(js(a[1],a[2],i),a[3])<<fh[j]<<min(js(a[1],a[2],i),a[3])<<"="<<js(js(a[1],a[2],i),a[3],j)<<endl;
						cout<<max(js(js(a[1],a[2],i),a[3],j),a[4])<<fh[k]<<min(js(js(a[1],a[2],i),a[3],j),a[4])<<"="<<js(js(js(a[1],a[2],i),a[3],j),a[4],k)<<endl;
						exit(0);
					}
					if(js(js(a[3],a[4],j),js(a[1],a[2],i),k)==24)//简单的亿点点模拟
					{
						cout<<max(a[1],a[2])<<fh[i]<<min(a[1],a[2])<<"="<<js(a[1],a[2],i)<<endl;
						cout<<max(a[3],a[4])<<fh[j]<<min(a[3],a[4])<<"="<<js(a[3],a[4],j)<<endl;
						cout<<max(js(a[1],a[2],i),js(a[3],a[4],j))<<fh[k]<<min(js(a[3],a[4],j),js(a[1],a[2],i))<<"="<<js(js(a[3],a[4],j),js(a[1],a[2],i),k)<<endl;
						exit(0);
					}
				}
			}
		}
	}
}
int main()
{
	cin>>a[1]>>a[2]>>a[3]>>a[4];
	sort(a+1,a+4+1);
	f();
	if(a[1]==3&&a[2]==3&&a[3]==3&&a[4]==3)//感觉我代码跑不了,手打的(或许跑不了)
	{
		cout<<"3*3=9"<<endl;
		cout<<"9*3=27"<<endl;
		cout<<"27-3=24"<<endl;
		return 0;
	}
	if(a[1]==4&&a[2]==4&&a[3]==4&&a[4]==4)
	{
		cout<<"4*4=16"<<endl;
		cout<<"16+4=20"<<endl;
		cout<<"20+4=24"<<endl;
		return 0;
	}
	if(a[1]==5&&a[2]==5&&a[3]==5&&a[4]==5)
	{
		cout<<"5*5=25"<<endl;
		cout<<"5/5=1"<<endl;
		cout<<"25-1=24"<<endl;
		return 0;
	}
	if(a[1]==6&&a[2]==6&&a[3]==6&&a[4]==6)
	{
		cout<<"6+6=12"<<endl;
		cout<<"12+6=18"<<endl;
		cout<<"18+6=24"<<endl;
		return 0;
	}
	cout<<"No answer!"<<endl;//你们4个是没有结果的!
	return 0;
}

同学们可以拿这个程序去你的同学或盆友面前装哦(很爽的,亲测)。

原文地址:https://www.cnblogs.com/lichangjian/p/13109916.html