作者 李佳

单位 重庆大学

24点游戏,也叫3824游戏,是一款经典的心算数字游戏。给出区间[1,13]内的四个整数,验证能否用加、减、乘、除四则运算,将这四个整数组合成24。比如:(3,8,2,4) 可以算出 8∗(4−3+2)=24或者(8−4)∗(2∗3)=24,而(1,1,2,2)无法算出24。注意整除必须除尽,即9/2+10+10=24这种计算无效。

输入格式:

第一行给出正整数N(1≤N≤1000)。接下来N行数据,每行给出四个正整数ai​ bi​ ci​ di​, 用空格分开。(∀i∈{1,...,N}:1≤ai​,bi​,ci​,di​≤13)

输出格式:

输出N行数据,第i行对应输入数据(ai​,bi​,ci​,di​),如果能算出24,则输出24,如果不能则输出0。

输入样例:

4
1 1 1 1
1 2 3 4
3 9 11 2
13 3 5 7

输出样例:

0
24
0
24

(1,1,1,1)和(3,9,11,2)都无法算出24,(1,2,3,4)和(13,3,5,7)可以算出:1∗2∗3∗4=24和(13∗5+7)/3=24。

个人思路:

借鉴了大佬的思路,但不足以解决问题,请教了学长,知道解题算法中的缺点,改正并记录一下。

此题大意是计算4个数通过各种组合能否计算出结果24,我们通过回溯还是可以遍历每一种加减乘除的可能,唯一不足就是,此题要求考虑括号,如果我们按照顺序计算四个数,那么肯定我们是无法实现括号的优先级功能的,此时大佬的思路:双层循环简直天神下凡,我们可以用这个双层循环实现4个数中任意两个数一起计算的可能,那么括号这个大问题就算解决了。

第二个问题,在回溯过程中,由于我们是通过双层循环选取的任意两个数,对于加法,两个数先后顺序是无所谓的,但在减法和除法中,两个数先后顺序不同会产生两种不同结果,于是我们要多加一次减法和除法。

来看代码:

#include<iostream>
using namespace std;
int arr[4];
bool dfs(int n)//n初始时等于4,每进行一次计算就减1
{if (n == 1)  //设置终点,返回计算结果是否等于24return arr[0] == 24;for (int i = 0; i < n; i++){for (int j = 0; j < n; j++){if (i == j) //同一个数就跳过continue;int op1 = arr[i], op2 = arr[j]; //op1和op2一会儿用来进行计算和恢复现场arr[i] = op1 + op2;arr[j] = arr[n - 1];//由于arr[j]已经被用掉了,要把此时未计算的队尾元素拿过来if (dfs(n - 1))return 1;arr[i] = op1 - op2;if (dfs(n - 1))return 1;arr[i] = op2 - op1;//减法多进行一次if (dfs(n - 1))return 1;arr[i] = op1 * op2;if (dfs(n - 1))return 1;if (op2 != 0 && op1 % op2 == 0){arr[i] = op1 / op2;if (dfs(n - 1))return 1;}if (op1 != 0 && op2 % op1 == 0)//除法多进行一次{arr[i] = op2 / op1;if (dfs(n - 1))return 1;}arr[i] = op1;arr[j] = op2;}}return 0;
}
int main()
{int n;cin >> n;while (n--){cin >> arr[0] >> arr[1] >> arr[2] >> arr[3];if (dfs(4))cout << "24" << endl;else cout << "0" << endl;}
}

7-5 3824经典游戏分数 20 作者 李佳单位 重庆大学相关推荐

  1. 7-3 找零钱***分数 20作者 李祥单位 湖北经济学院

    作者 李祥 单位 湖北经济学院 收银员现有 n 张面值分别为 v1​,v2​,...,vn​ 的纸币.若找零金额为 m,则一共有多少种找零方法? 注:0<n≤1000,0<v1​,v2​, ...

  2. 整除光棍 分数 20作者 翁恺单位 浙江大学

    这里所谓的"光棍",并不是指单身汪啦~ 说的是全部由1组成的数字,比如1.11.111.1111等.传说任何一个光棍都能被一个不以5结尾的奇数整除.比如,111111就可以被13整 ...

  3. 7-9 矩阵乘法分数 25作者 arbalest单位 河北大学

    给出一个大小为N1​×M1​ 的矩阵A和一个大小为N2​×M2​的矩阵B, 令矩阵C=A×B, 输出C. 矩阵乘法的公式为Ci,j​=k=1∑M1​​Ai,k​∗Bk,j​, 矩阵C的第i行第j列是C ...

  4. R7-1 jmu-python-找字符分数 15作者 linli单位 集美大学输入一个字符串及字符,输出第一次出现该字符的位置。输入格式:行1:输入字符串行2:输入一个字符输出格式:

    R7-1 jmu-python-找字符 输入一个字符串及字符,输出第一次出现该字符的位置. 输入格式: 行1:输入字符串 行2:输入一个字符 输出格式: 找到,输出对应位置,格式index=X的, X ...

  5. PAT1014 福尔摩斯的约会 分数 20

    1014 福尔摩斯的约会 分数 20 作者 CHEN, Yue 单位 浙江大学 大侦探福尔摩斯接到一张奇怪的字条: 我们约会吧! 3485djDkxh4hhGE 2984akDfkkkkggEdsb ...

  6. PAT1019 数字黑洞 分数 20

    1019 数字黑洞 分数 20 作者 CHEN, Yue 单位 浙江大学 给定任一个各位数字不完全相同的 4 位正整数,如果我们先把 4 个数字按非递增排序,再按非递减排序,然后用第 1 个数字减第 ...

  7. 重温历史:Palm OS经典游戏于发布20年后公开源代码

    整理 | 彭慧中 责编 | 屠敏 出品 | CSDN(ID:CSDNnews) 近日,慕尼黑的开发者Aaron Ardiri公布了Palm OS经典游戏的源代码,而他正是曾经开发Palm OS的工程师 ...

  8. 经典游戏制作教程[小糊涂的灵感]

    经典游戏制作教程 peng 1.游戏制作的主要流程 -------------------------------------------------------------------------- ...

  9. C语言经典游戏代码大全(珍藏版)

    前言 发现很多朋友都想要一些小项目来练手,却找不到从哪里寻找,给大家整理了游戏项目开发源代码汇总. 一.最经典游戏之俄罗斯方块 #include<iostream> #include< ...

最新文章

  1. 几种任务调度的 Java 实现方法与比较--转载
  2. 理解stl中的erase
  3. shell中的函数、shell中的数组、 告警系统需求分析
  4. python实现链表的删除_Python垃圾回收机制
  5. 计算机考研落榜了怎么办,考研落榜了怎么办
  6. 历时 4 年,阿里云推出金融核心系统转型实践书
  7. 统计twitter帖子_在Kubernetes上部署InfluxDB和Grafana以收集Twitter统计信息
  8. u8api openapi_使用OpenAPI规范进行更好的API测试
  9. 64位系统目录在那里_旷视王珏:前Adobe首席科学家,手握64项专利,曾助力奥斯卡...
  10. java堆栈_Java堆栈– Java堆栈
  11. CF 766C - Mahmoud and a Message (DP+字符串)
  12. Spring拦截器和过滤器的区别及详解
  13. LED数码管结构与工作原理
  14. 『原创』老范的来电防火墙v1.0发布了(图文)
  15. c语言嵌入式系统修炼之道
  16. ospf(开放式最短路径优先协议)
  17. VS2013 如何创建应用程序图标
  18. 安装Dev c++后,编译文件出现未编译的解决方法
  19. 【C语言中“%d %%d %%%d“代表的意思】
  20. 笔记本电脑突然断网,intel wireless AC 9462驱动无法启动

热门文章

  1. wifi连接一段时间才能上网_Win7系统下连接wifi一段时间就自动断线怎么办【图文】...
  2. 过了所有技术面,却倒在 HR 一个问题上
  3. 学术期刊数据库---EBSCO
  4. 数学模型转化为计算机语言,程序设计语言类课程教学选题方法探讨
  5. java常见的密码加密方式base64,Sha256,MD5
  6. 计算机输入设备的作用,认识计算机输入设备—键盘
  7. AI绘画是什么软件?看完你就知道了
  8. 蛋白质女孩---走出软件作坊:三五个人十来条枪 如何成为开发正规军(三十)
  9. 下载centOS,下载各种linux版本的镜像,来这里!
  10. CAD格式交换全能:CAD DLL 15.0 Crack