PTA7-8 h0115. 算24
一、题目描述
二、解题思路
首先想到的是dfs进行逐个遍历,但是会有两个错
第一个:如果出现不能整除的情况,那么答案就会丢失,因此我们需要设置一个精度,在这个范围内的答案我们都要去接受他。
第二个:如果出现(a + b)* (c + d) == 24的这种情况,我们的dfs逐个遍历就不能做到这种,因此我们就需要每次把进行计算的结果重新放入数组,然后递归下去的时候再拿出来参与计算。
三、代码实现
1 #include <bits/stdc++.h> 2 using namespace std; 3 const double inf = 1e9 + 10; 4 const double eps = 1e-5; 5 bool ok = false; 6 void dfs(int f,double a[]) 7 { 8 if(f == 1){ 9 for(int i = 1;i <= 4;i++) 10 if(fabs(24 - a[i]) <= eps) 11 ok = true; 12 return; 13 } 14 if(ok) 15 return; 16 for(int i = 1;i <= 4;i++){ 17 double sum = a[i]; 18 if(a[i] == inf) 19 continue; 20 a[i] = inf; 21 for(int j = 1;j <= 4;j++){ 22 double sum1 = a[j]; 23 if(a[j] == inf) 24 continue; 25 a[j] = sum1 + sum; 26 dfs(f - 1,a); 27 a[j] = sum1 - sum; 28 dfs(f - 1,a); 29 a[j] = sum - sum1; 30 dfs(f - 1,a); 31 a[j] = sum * sum1; 32 dfs(f - 1,a); 33 if(sum){ 34 a[j] = sum1 / sum; 35 dfs(f - 1,a); 36 } 37 if(sum1){ 38 a[j] = sum / sum1; 39 dfs(f - 1,a); 40 } 41 a[j] = sum1; 42 } 43 a[i] = sum; 44 } 45 } 46 int main() 47 { 48 double a[5]; 49 while(cin >> a[1] >> a[2] >> a[3] >> a[4]){ 50 if(!a[1] && !a[2] && !a[3] && !a[4]) 51 break; 52 ok = false; 53 dfs(4,a); 54 if(ok) 55 cout << "YES" << endl; 56 else 57 cout << "NO" << endl; 58 59 } 60 return 0; 61 }
本文来自博客园,作者:{scanner},转载请注明原文链接:{https://home.cnblogs.com/u/scannerkk/}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 按钮权限的设计及实现