AlenaNuna

导航

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

posted on 2024-09-19 00:46  AlenaNuna  阅读(9)  评论(0编辑  收藏  举报