日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

[HDU 1427]速度计算24点(DFS暴力搜索)

發布時間:2025/4/16 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [HDU 1427]速度计算24点(DFS暴力搜索) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
主題連接: 

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暴力搜索)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。