HJ67 24点游戏算法
HJ67 24点游戏算法
题目:https://www.nowcoder.com/practice/fbc417f314f745b1978fc751a54ac8cb?tpId=37&tqId=21290&rp=1&ru=/exam/oj/ta&qru=/exam/oj/ta&sourceUrl=%2Fexam%2Foj%2Fta%3FtpId%3D37&difficulty=undefined&judgeStatus=undefined&tags=&title=
非常非常有意思,思路很巧妙的一道题。
dfs(const vector<double>&a)处理当前数字组。
如果a.size()==1,则证明数字组中只剩一个数字。判断该数字是否为24。由于是浮点数,需要考虑精度问题。fabs用于计算double范围的绝对值。(fabsl用于计算long double范围的绝对值)fabs(a[0]-24)<1e-6就是在抹去精度的影响。
如果a数组中的数不止1的话,则i和j分别遍历a中的两个位置不同的数字,然后依次进行加减乘除处理,将处理后的结果扔进新的数字组b中,b中还需要添加本轮运算中没有用到的数字(非a[i]非a[j]),然后拿b数字组扔进dfs里进行新一轮的计算。pop_back()可以用于取出vector<>的最后一个元素。所以可以用来方便地回溯。每次取出两个数字进行运算的过程即是在模仿括号运算的过程。
注意使用除法时被除数不能为0。
1 #include<bits/stdc++.h> 2 using namespace std; 3 4 void dfs(const vector<double>&a){ 5 if(a.size()==1){ 6 if(fabs(a[0]-24)<1e-6){ 7 puts("true"); 8 exit(0); 9 } 10 return; 11 } 12 for(int i=0;i<a.size();i++){ 13 for(int j=0;j<a.size();j++){ 14 if(i!=j){ 15 vector<double>b; 16 b.clear(); 17 for(int k=0;k<a.size();k++) 18 if(k!=i&&k!=j)b.push_back(a[k]); 19 double x=a[i],y=a[j]; 20 b.push_back(x+y); dfs(b); 21 b.pop_back(); b.push_back(x-y); dfs(b); 22 b.pop_back(); b.push_back(x*y); dfs(b); 23 b.pop_back(); if(y!=0){b.push_back(x/y); dfs(b);} 24 } 25 } 26 } 27 } 28 int main(){ 29 vector<double>a(4); 30 for(int i=0;i<4;i++) cin>>a[i]; 31 dfs(a); 32 puts("false"); 33 }
by:AlenaNuna