小时候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; }
同学们可以拿这个程序去你的同学或盆友面前装哦(很爽的,亲测)。