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
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix