小時候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; }
同窗們能夠拿這個程序去你的同窗或盆友面前裝哦(很爽的,親測)。