總時(shí)間限制: 3000ms 內(nèi)存限制: 65536kB 【】描述 給出4個(gè)小于10個(gè)正整數(shù),你可以使用加減乘除4種運(yùn)算以及括號(hào)把這4個(gè)數(shù)連接起來(lái)得到一個(gè)表達(dá)式。現(xiàn)在的問(wèn)題是,是否存在一種方式使得得到的表達(dá)式的結(jié)果等于24。
這里加減乘除以及括號(hào)的運(yùn)算結(jié)果和運(yùn)算的優(yōu)先級(jí)跟我們平常的定義一致(這里的除法定義是實(shí)數(shù)除法)。
比如,對(duì)于5,5,5,1,我們知道5 * (5 – 1 / 5) = 24,因此可以得到24。又比如,對(duì)于1,1,4,2,我們?cè)趺炊疾荒艿玫?4。 【】輸入 輸入數(shù)據(jù)包括多行,每行給出一組測(cè)試數(shù)據(jù),包括4個(gè)小于10個(gè)正整數(shù)。最后一組測(cè)試數(shù)據(jù)中包括4個(gè)0,表示輸入的結(jié)束,這組數(shù)據(jù)不用處理。 【】輸出 對(duì)于每一組測(cè)試數(shù)據(jù),輸出一行,如果可以得到24,輸出“YES”;否則,輸出“NO”。 【】樣例輸入 5 5 5 1 1 1 4 2 0 0 0 0 【】樣例輸出 YES NO
代碼(學(xué)自syx大佬)
#include<iostream>#include<cstdio>#include<algorithm>#include<cstring>#include<string>#include<cmath>#define LL long long#define p 0.00000001using namespace std;double num[5];bool f[5];bool dfs(int k)//計(jì)算完的卡號(hào) { if(k==4){ for(int i=1;i<=4;i++) if(!f[i]&&fabs(num[i]-24.0)<p) return true; return false; } for(int i=1;i<=4;i++) if(!f[i]) for(int j=i+1;j<=4;j++) if(!f[j])//未計(jì)算過(guò) { double tmp1=num[i],tmp2=num[j]; num[i]=tmp1+tmp2;f[j]=true; if(dfs(k+1)) return true; f[j]=false; num[i]=tmp1*tmp2;f[j]=true; if(dfs(k+1)) return true; f[j]=false; num[i]=tmp1-tmp2;f[j]=true; if(dfs(k+1)) return true; f[j]=false; num[i]=tmp2-tmp1;f[j]=true; if(dfs(k+1)) return true; f[j]=false; num[i]=tmp1/tmp2;f[j]=true; if(dfs(k+1)) return true; f[j]=false; num[i]=tmp2/tmp1;f[j]=true;//減或除以有兩種情況 這是一個(gè)坑 if(dfs(k+1)) return true; f[j]=false; num[i]=tmp1;f[j]=false;//回溯 } return false;}int main(){ while(1){ memset(f,false,sizeof(f));//多組數(shù)據(jù),每次初始化 scanf("%lf%lf%lf%lf",&num[1],&num[2],&num[3],&num[4]); if(num[1]==0&&num[2]==0&&num[3]==0&&num[4]==0) break; if(dfs(1))
|
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注