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;
}

同窗們能夠拿這個程序去你的同窗或盆友面前裝哦(很爽的,親測)。

相關文章
相關標籤/搜索