[HDU 1427]速度计算24点(DFS暴力搜索)
生活随笔
收集整理的這篇文章主要介紹了
[HDU 1427]速度计算24点(DFS暴力搜索)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
主題連接:
本文轉自mfrbuaa博客園博客,原文鏈接:http://www.cnblogs.com/mfrbuaa/p/5049620.html,如需轉載請自行聯系原作者
http://acm.hdu.edu.cn/showproblem.php?pid=1427
思路:簡單的DFS。dfs(sum,next,p)表示當前已經算出的值是sum,括號里算出的值是next,當前使用的卡片下標為p,實際上是把括號外和括號內的兩部分值分成sum和next來處理了。
直覺告訴我們4個數僅僅須要一層括號參與運算就夠了,不會也不必用多重括號改變運算順序,因此上面的dfs思路是正確的。
那么對于下一張卡片,有兩種處理方式:
1、把next算入sum中。下一張卡片成了新的括號里的算式的值。
2、把下一張卡片的值算入next中,下一張卡片增加了括號里。
對于上述兩種處理方式,每種方式又分成加減乘除四種情況討論。而對于除法這樣的情況須要特殊處理,除數不能為0,并且題目中要求運算過程中不能出現小數。因此在做除法運算前須要檢查。
#include <iostream> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <string> #include <algorithm>using namespace std;int cardNum[10]; //cardNum[i]=第i張牌的數字大小 bool flag=false; //flag=true表明能算出24點int getNum(string s) //撲克牌編號s轉數字 {if(s[0]>='2'&&s[0]<='9') return s[0]-'0';if(s=="10") return 10;switch(s[0]){case 'A': return 1;case 'J': return 11;case 'Q': return 12;case 'K': return 13;} }void dfs(int sum,int next,int p) //表示當前已經算出的值是sum,括號里算出的值是next,當前使用的卡片下標為p {if(p==4) //正在用第4張牌{if(sum+next==24||sum-next==24||sum*next==24)flag=true;if(next!=0&&sum%next==0&&sum/next==24)flag=true;return;}//1、不加括號dfs(sum+next,cardNum[p+1],p+1);dfs(sum-next,cardNum[p+1],p+1);dfs(sum*next,cardNum[p+1],p+1);if(next!=0&&sum%next==0)dfs(sum/next,cardNum[p+1],p+1);//2、加括號。則須要改變運算順序dfs(sum,next+cardNum[p+1],p+1);dfs(sum,next-cardNum[p+1],p+1);dfs(sum,next*cardNum[p+1],p+1);if(cardNum[p+1]!=0&&next%cardNum[p+1]==0)dfs(sum,next/cardNum[p+1],p+1); }int main() {string in;while(cin>>in){flag=false;cardNum[1]=getNum(in);for(int i=2;i<=4;i++){cin>>in;cardNum[i]=getNum(in);}sort(cardNum+1,cardNum+5);do{dfs(cardNum[1],cardNum[2],2);}while(!flag&&next_permutation(cardNum+1,cardNum+5));if(flag)printf("Yes\n");elseprintf("No\n");}return 0; }本文轉自mfrbuaa博客園博客,原文鏈接:http://www.cnblogs.com/mfrbuaa/p/5049620.html,如需轉載請自行聯系原作者
總結
以上是生活随笔為你收集整理的[HDU 1427]速度计算24点(DFS暴力搜索)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: spring整合redis缓存
- 下一篇: java.util.regex包下的Pa