總時間限制: 3000ms 內(nèi)存限制: 65536kB 【】描述 給出4個小于10個正整數(shù),你可以使用加減乘除4種運算以及括號把這4個數(shù)連接起來得到一個表達式?,F(xiàn)在的問題是,是否存在一種方式使得得到的表達式的結(jié)果等于24。
這里加減乘除以及括號的運算結(jié)果和運算的優(yōu)先級跟我們平常的定義一致(這里的除法定義是實數(shù)除法)。
比如,對于5,5,5,1,我們知道5 * (5 – 1 / 5) = 24,因此可以得到24。又比如,對于1,1,4,2,我們怎么都不能得到24。 【】輸入 輸入數(shù)據(jù)包括多行,每行給出一組測試數(shù)據(jù),包括4個小于10個正整數(shù)。最后一組測試數(shù)據(jù)中包括4個0,表示輸入的結(jié)束,這組數(shù)據(jù)不用處理。 【】輸出 對于每一組測試數(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)//計算完的卡號 { 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])//未計算過 { 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;//減或除以有兩種情況 這是一個坑 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))新聞熱點
疑難解答