最近迷上了“24点”的游戏,但是我又经常被对手虐的跟苟一样,因此我决定用我最擅长的编程来助我虐暴对手(然而并没有什么卵用)。

在颓废并降智商后的我多次思考下,我想出了以下的解法:

#include <cstdio>
#include <cmath>
#include <string>
#include <cstdlib>
#include <iostream>
using namespace std;const int n=4;
double a[n+1];
string s[n+1];
char c[3];bool so(int g){if (g==n){if (fabs(a[n]-24)<1e-6){cout << s[n] << endl;return 1;}return 0;}for (int i=g+1; i<=n; ++i){double x=a[i],y=a[g];string sx=s[i],sy=s[g];s[i]='('+sx+'+'+sy+')',a[i]=x+y; if (so(g+1)) return 1;s[i]='('+sx+'-'+sy+')',a[i]=x-y; if (so(g+1)) return 1;s[i]='('+sy+'-'+sx+')',a[i]=y-x; if (so(g+1)) return 1;s[i]='('+sx+'*'+sy+')',a[i]=x*y; if (so(g+1)) return 1;if (y) s[i]='('+sx+'/'+sy+')',a[i]=x/y; if (so(g+1)) return 1;if (x) s[i]='('+sy+'/'+sx+')',a[i]=y/x; if (so(g+1)) return 1;a[i]=x,a[g]=y,s[i]=sx,s[g]=sy;}return 0;
}int main(void){for (int i=1; i<=n; ++i) scanf("%lf",&a[i]),itoa(a[i],c,10),s[i]=c;if (!so(1)) puts("No solution!");return 0;
}

试了好多的题目都没出问题,这个程序也帮我赢了好多盘对局。

是的,你知道我接下来要说什么的,这个解法是有问题的……

当我在对局是遇到了这样一组数据:1 4 5 6,然后我把这组数据输入到我的程序中,蹦出来的是“No solution”……

wtf?怎么可能无解?!崩溃的我又扔下了膈膜,开始修改我的程序。

不久后我发现这种解法的确存在一种问题:必定是将第一个数和其他的数先进行合成,然后才是其他数字的合成。

我把输入数据改成了4 5 6 1,果然蹦出了“(6/((5/4)-1))”的解决方案。

然而我们怎样来修改这个程序呢?套个全排列?不,这样太慢了。

我们可以在当前枚举的位置前面找两个位置,先把这两个数字进行合成,然后将当前位置上的数字移动到枚举的两个位置中的一个上,另一个用来存合成的方案。

代码和上面的那个是差不多的:

#include <cstdio>
#include <cmath>
#include <string>
#include <cstdlib>
#include <iostream>
using namespace std;const int n=4;
double a[n+1];
string s[n+1];
char c[3];bool so(int g){if (g==1){if (fabs(a[1]-24)<1e-6){cout << s[1] << endl;return 1;}return 0;}for (int i=1; i<=g; ++i)for (int j=i+1; j<=g; ++j){double x=a[i],y=a[j];a[j]=a[g];string sx=s[i],sy=s[j];s[j]=s[g];s[i]='('+sx+'+'+sy+')',a[i]=x+y; if (so(g-1)) return 1;s[i]='('+sx+'-'+sy+')',a[i]=x-y; if (so(g-1)) return 1;s[i]='('+sy+'-'+sx+')',a[i]=y-x; if (so(g-1)) return 1;s[i]='('+sx+'*'+sy+')',a[i]=x*y; if (so(g-1)) return 1;if (y) s[i]='('+sx+'/'+sy+')',a[i]=x/y; if (so(g-1)) return 1;if (x) s[i]='('+sy+'/'+sx+')',a[i]=y/x; if (so(g-1)) return 1;a[i]=x,a[j]=y,s[i]=sx,s[j]=sy;}return 0;
}int main(void){freopen("x.txt","r",stdin);for (int i=1; i<=n; ++i) scanf("%lf",&a[i]),itoa(a[i],c,10),s[i]=c;if (!so(n)) puts("No solution!");return 0;
}

这样我们就成功解决了这个“24点”问题。

上面的那个代码我到现在还没找到错误,如果有读者发现了错误,请评论一下,我会及时改正的(可能吧)。

关于“24点”游戏的解法相关推荐

  1. 计算机24点游戏几把,24点游戏规则和解题方法

    24点游戏规则和解题方法 "巧算24点"的游戏内容如下:一副牌中抽去大小王剩下52张,(如果初练也可只用1-10这40张牌)任意抽取4张牌(称牌组),用加.减.乘.除(可加括号)把 ...

  2. 24点游戏的递归解法和Python实现

    24点游戏的递归解法和Python实现 目录 24点游戏的递归解法和Python实现 什么是24点游戏 递归思路 递归 24点问题的递归思路 Python代码实现 四则运算下无解的组合 总结 什么是2 ...

  3. python24点计算器_Python实现24点游戏

    24点游戏是一款老少咸宜的益智游戏,游戏的玩法是给出任意四个数字,通过加减乘除四则运算,计算出24. 网上有很多24点游戏算法,找出解法并不难,但是难在如何合适地加括号和去除等价的重复表达式上. 1. ...

  4. C语言项目实战:24点游戏计算器(基于结构体、指针、函数、数组、循环等知识点)

    文章目录 C语言项目实战:24点游戏计算器(基于结构体.指针.函数.数组.循环等知识点) 前言:24点游戏计算器的规则如下 一.项目的创建标 1.选择项目 2.输入项目名称和路径 3.创建头文件Mai ...

  5. linux中24点游戏下载,怀旧24点官网版-怀旧24点游戏下载v2.0.0-Linux公社

    怀旧24点游戏,是一款可以开发思维的休闲益智类手机游戏.游戏中有着精美简约的画面,并且有多个不同的游戏模式和等级场次玩家可以自由进行选择.怀旧24点游戏内容丰富多彩,还支持多种语言系统.每日登录签到还 ...

  6. 计算24点游戏精化算法剖析

    很多人都玩过这个数学味儿很浓的益智游戏:抽出4张扑克牌,牌上的点数代表四个数字,花牌视为1点(有的把J.Q.K分别视为11.12.13点),玩家中谁最先运用加减乘除四则运算,由这四个数计算出24,谁就 ...

  7. html 计算24点游戏,0048 JavaScript编程实现算24点游戏

    原标题:0048 JavaScript编程实现算24点游戏 上节课在网页上使用Java实现了根据输入日期计算星座的程序. 这节课来做一个算24点游戏,主要是练习使用Java来控制网页元素. 程序设计思 ...

  8. php 24点算法,PHP实现简单的24点游戏

    忽然想到做一个小应用,需要使用到24点判断,故而写一个简单版的. 代码粗糙,轻拍. /** * 24点游戏 * @author 长安猎人 */ $arr = [10, 4, 5, 3]; $opArr ...

  9. 【c#】24点游戏的实现(可存档且局域网互联)

    (更新,附上此款游戏的源代码供大家学习吧!http://download.csdn.net/detail/gshengod/5774531) lz辛苦考上了北邮的研究生,刚进入实验室,就接到了一个棘手 ...

最新文章

  1. Android 在menu中同时显示Icon和Text
  2. ORA-01034: ORACLE not available ORA-27101
  3. java中序列化与反序列化_Java中的序列化
  4. 陶哲轩实分析 定理 13.1.5
  5. spss 22 0统计分析从入门到精通_「转需」20+统计分析软件使用工具包,一次全搞定...
  6. IOS初始化控制器的两种方法
  7. java继承实现不用每个类都写toString方法
  8. asp.net mvc 依赖缓存启动项配置
  9. rmi 反序列化漏洞_写一个rmi反序列化工具
  10. CHIL-SQL-FOREIGN KEY 约束
  11. 凸优化有关的数值线性代数知识 3LU Cholesky和LDL因式分解
  12. Go黑魔法之cgo reflect访问list存储C指针
  13. Java生成随机常用汉字或姓名
  14. 互联网晚报 | 11月22日 星期一 | 华为正式开启二手机业务;B站通过收购获得支付牌照;字节跳动公益平台正式上线...
  15. 微信小程序开发-软件外包平台案例
  16. note同步不及时 one_解决无法同步 OneNote 的问题
  17. Silverlight加载xap后通过反射相互调用方法及元素
  18. Windows小技巧 -- 已连接wifi密码查看
  19. 嵌入式面试常见问题(三)
  20. 零基础学平面设计是自学好还是报班好?

热门文章

  1. NLP学习(十)-情感分析技术及案例实现-Python3实现
  2. 海信在柏林IFA推出8K叠屏和屏幕发声激光电视
  3. WOT2015 互联网运维与开发者大会上的演讲
  4. Android 移动开发 近场通信 蓝牙通信
  5. 模拟病人排队看病过程c语言,模拟病人到医院排队看病上机内容完整实验报告.doc...
  6. 如何在模拟器中安装App
  7. 一文查看公信宝查封始末,CEO此前曾表示获利数千万
  8. springboot2初期笔记存档
  9. android 坐标系 旋转,android IMU旋转矩阵横屏矫正(remapCoordinateSystem函数原理)
  10. ai智能医疗产业_人工智能以减少医疗错误