P1236 算24点(洛谷)

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

今天我想试试本身长大了没(并无),而后就被24点给玩了QWQ。ios

今天我和个人好盆友,隔壁的dgdger和chengxx大佬一块儿玩24点(平常不刷题),而后发现高估本身实力了,大部分咱们都不会,而后一脸蒙蔽的百度QWQ数组

由于2个大佬太强了,我一直玩不过他们,玩不过怎么办呢?固然是好好练习开挂啦!函数

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

抱着侥幸内心去水了一波(亏大发了),而后我就调试了2节课,好在成功AC了,居然AC了,就来帮帮尚未AC的同窗们吧(想玩24点做弊的同窗也帮一下)调试

先看题板:blog

题目描述
几十年前全世界就流行一种数字游戏,至今仍有人乐此不疲.在中国咱们把这种游戏称为“算24点”。您做为游戏者将获得4个1~9之间的天然数做为操做数,而您的任务是对这4个操做数进行适当的算术运算,要求运算结果等于24。
您能够使用的运算只有:+,-,*,/,您还能够使用()来改变运算顺序。注意:全部的中间结果须是整数,因此一些除法运算是不容许的(例如,(2*2)/4是合法的,2*(2/4)是不合法的)。下面咱们给出一个游戏的具体例子:
若给出的4个操做数是:一、二、三、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)ip

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

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,咱们想让他从1 2 3 4开始,就要小小的用一下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)
		{
			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;
}

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

相关文章
相关标签/搜索