国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

!算 24 (dfs)

2019-11-11 07:49:39
字體:
來源:轉載
供稿:網友

總時間限制: 3000ms 內存限制: 65536kB 【】描述 給出4個小于10個正整數,你可以使用加減乘除4種運算以及括號把這4個數連接起來得到一個表達式。現在的問題是,是否存在一種方式使得得到的表達式的結果等于24。

這里加減乘除以及括號的運算結果和運算的優先級跟我們平常的定義一致(這里的除法定義是實數除法)。

比如,對于5,5,5,1,我們知道5 * (5 – 1 / 5) = 24,因此可以得到24。又比如,對于1,1,4,2,我們怎么都不能得到24。 【】輸入 輸入數據包括多行,每行給出一組測試數據,包括4個小于10個正整數。最后一組測試數據中包括4個0,表示輸入的結束,這組數據不用處理。 【】輸出 對于每一組測試數據,輸出一行,如果可以得到24,輸出“YES”;否則,輸出“NO”。 【】樣例輸入 5 5 5 1 1 1 4 2 0 0 0 0 【】樣例輸出 YES NO

代碼(學自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));//多組數據,每次初始化 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))
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 巴林左旗| 舟山市| 澜沧| 大关县| 五大连池市| 大洼县| 大足县| 临澧县| 桃园县| 辽中县| 扬中市| 五华县| 北安市| 玉山县| 铁力市| 门头沟区| 伊宁市| 灵武市| 民丰县| 会理县| 徐州市| 巴楚县| 蒙山县| 衢州市| 乐至县| 九江县| 南江县| 靖安县| 徐闻县| 曲靖市| 辽阳县| 玉屏| 临夏县| 东平县| 缙云县| 新竹市| 交口县| 故城县| 孙吴县| 彩票| 抚顺县|