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