【a501】算24点
Time Limit: 1 second
Memory Limit: 32 MB
【问题描述】
几十年前全世界就浒一种数字游戏,至今仍有人乐此不疲。在中国我们把这种游戏称为“算24点”。您作为游戏者将得到4个1~9之间的自然数作为操作数,而你的任务是对这4个操作数进行适当的算术运算,要求运算结果等于24。
你可以使用的运算只有:+、-、*、/,你还可以使用()来改变运算顺序。注意:所有的中间结果必须是整数,所以一些除法运算是不允许的(如,(2*2)/4是合法的,2*(2/4)是不合法的)。下面给出一个游戏的具体例子:
若给出的4个操作数是:1、2、3、7,则一种可能的解答是1+2+3*7=24。
【输入格式】
仅有一行,四个1到9之间的自然数。
【输出格式】
如果有解的话,只要输出一个解,输出的是三行数据,分别表示运算的步骤。其中第一行是输入的两个数和一个运算符和运算后的结果,第二行是第一行的结果和一个输入的数据、运算符、运算后的结果;第三行是第二行的结果和输入的一个数、运算符和“=24”。如果两个操作数有大小的话则先输出大的。
如果没有解则输出“No answer!”
【输入样例】
1 2 3 7
【输出样例】
2+1=3
7*3=21
21+3=24
【题解】 搜索的策略是,这4个数字只进行三次运算。 我们只需要在搜索里加两个变量就可以了(int 当前算式的和,int 当前进行了几次运算) 然后加括号的问题,可以用全排列的方法解决。即把所有的数字和运算符的组合方式表示出来。然后看它 们的和是否为24. 运算次数==4的时候,判断一下和是否为24.如果是就输出。 注意在进行减法和除法之前。要先判断一下a是否大于b,如果不是,则需要调换顺序再减。注意不是看到 a<b就直接跳过了,而是更换一下它们的数字再减。这是个坑点。 【代码】#include <cstdio>
#include <stdlib.h> int a[5],num[4][2],ans[4];
bool bo[5];
char sym[4]; void input_data()
{
for (int i = 1;i <= 4;i++) //bo数组用来判断哪一些数字可以用,一开始全部可用
bo[i] = true;
for (int i = 1;i <= 4;i++) //输入4个数字
scanf("%d",&a[i]);
} void sear_ch(int now,int p) //当前算式的和为now,且进行到第p步运算
{
if (p > 3)
{
if (now == 24) //如果已经进行完3次运算 且和为24
{
for (int i = 1;i <= 3;i++) //输出3次运算的算式
{
int aa = num[i][0],bb = num[i][1];
if ( num[i][1] > num[i][0]) //大的靠前输出
a[0] = aa,aa = bb,bb = a[0];
printf("%d",aa);
putchar(sym[i]);
printf("%d=%d\n",bb,ans[i]); }
exit(0);
}
return;
}
for (int i = 1;i <= 4;i++) //找下一个可以用来运算的数字
if (bo[i])
{
int x = now,y = a[i]; //这是在做除法和减法的时候a < b的情况的特殊处理
if (x < y)
{
int t = x;
x = y;
y =t ;
} bo[i] = false; num[p][0] = x;
num[p][1] = y; //plus
sym[p] = '+'; //plus运算则不需要调换顺序
ans[p] = now+a[i]; //其实这里可以用x,y代替。这样最后就不用判断那一个大了。
sear_ch(now+a[i],p+1); //subtract
sym[p] = '-'; //subtract运算则需要 x > y,且一开始如果now < a[i]
//不能跳过,而要调换顺序然后再做减法
ans[p] = x-y;
sear_ch(x-y,p+1); //multiply
sym[p] = '*'; //multiply运算则不必管大小
ans[p] = now*a[i];
sear_ch(now*a[i],p+1); //division if (y != 0 && x % y == 0) //如果能够整除则可以除。因为有说不能出现分数。
{
sym[p] = '/';
ans[p] = x / y;
sear_ch(x/y,p+1);
} bo[i] = true;
}
} void get_ans()
{
for (int i = 1;i <= 4;i++) //全排列。
{
bo[i] = false;
sear_ch(a[i],1);
bo[i] = true;
}
} int main()
{
//freopen("F:\\rush.txt","r",stdin);
input_data();
get_ans();
printf("No answer!"); //最后要记得输出无解信息。
return 0;
}
【a501】算24点的更多相关文章
- hdu 1427 速算24点
题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=1427 速算24点 Description 速算24点相信绝大多数人都玩过.就是随机给你四张牌,包括A( ...
- 24点游戏&&速算24点(dfs)
24点游戏 Time Limit: 3000/1000MS (Java/Others) Memory Limit: 65535/65535KB (Java/Others) Submit Sta ...
- hdu1427之速算24点
速算24点 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Subm ...
- python实现算24的算法
1.介绍 给定4个整数,数字范围在1-13之间,任意使用 + - * / ( ) ,构造出一个表达式,使得最终结果为24,这就是常见的算24的游戏.本文介绍用Python语言实现的两种方式.2.实现思 ...
- python 穷举法 算24点(史上最简短代码)
本来想用回溯法实现 算24点.题目都拟好了,就是<python 回溯法 子集树模板 系列 -- 7.24点>.无奈想了一天,没有头绪.只好改用暴力穷举法. 思路说明 根据四个数,三个运算符 ...
- hdu 1427 速算24点 dfs暴力搜索
速算24点 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Problem De ...
- Hdu1427 速算24点 2017-01-18 17:26 46人阅读 评论(0) 收藏
速算24点 Time Limit : 2000/1000ms (Java/Other) Memory Limit : 65536/32768K (Java/Other) Total Submiss ...
- HDU 1427 速算24点 (深搜)
题目链接 Problem Description 速算24点相信绝大多数人都玩过.就是随机给你四张牌,包括A(1),2,3,4,5,6,7,8,9,10,J(11),Q(12),K(13).要求只用' ...
- 【Nodejs】“快算24”扑克牌游戏算法 1.02
快算24是一种挺好的锻炼孩子算数能力的扑克牌游戏,它的游戏方式是把四张牌的牌面数值通过有限四则运算得到结果24,四张牌必须仅用一次.各地玩法还有点差别,有的只算1-10,其它抽出来:有的地方把整幅牌都 ...
随机推荐
- 右键菜单→新建→BAT 批处理文件
目的:以前编写BAT,通常新建一个文本,然后另存为 .bat,比较麻烦,那么如何右键新建菜单里添加新建批处理文件呢? 代码如下: @echo offcd /d %temp%echo Windows R ...
- SpringMVC之类型转换Converter
(转载:http://blog.csdn.net/renhui999/article/details/9837897) 1.1 目录 1.1 目录 1.2 前言 1.3 ...
- Redis源代码分析(八)--- t_hash哈希转换
在上次的zipmap分析完之后,事实上关于redis源码结构体部分的内容事实上已经所有结束了.由于以下还有几个和结构体相关的操作类,就页把他们归并到struct包下了.这类的文件有:t_hash.c, ...
- CentOS下利用Docker部署Surging
原文:CentOS下利用Docker部署Surging 1. 安装Centos, 配置固定ip配置文件地址vi /etc/sysconfig/network-scripts/ifcfg-ens33`` ...
- 【Codeforces Round #299 (Div. 2) C】 Tavas and Karafs
[链接] 我是链接,点我呀:) [题意] 给你一个规则,让你知道第i根萝卜的高度为si = A+(i-1)*B 现在给你n个询问; 每次询问给你一个固定的起点l; 让你找一个最大的右端点r; 使得l. ...
- Oracle游标进行循环效率比较
对300万一张表数据,用游标进行循环,不同写法的效率比较 对300万一张表数据,用游标进行循环,不同写法的效率比较 1.显示游标 declare cursor cur_2 is sel ...
- 【习题5-3 UVA-10935】Throwing cards away I
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 用STL的queue写 [代码] #include <bits/stdc++.h> using namespace st ...
- swift项目第二天:初始化项目
初始化项目 项目的部署版本 之后项目会运行在哪些系统中 横竖屏的支持 iPhone应用一般只支持横屏 iPhone游戏一般支持竖屏 iPad横竖屏都支持 设置项目的图标和启动图片 项目的图标(美工做好 ...
- 12.1、USB驱动——描述符、URB、管道
大家常说,一个设备通常有多个配置,配置通常有多个接口,接口通常有多个端点.接口代表逻辑上的设备,比如声卡分为 录音和播放.访问设备时,访问的是某个接口(逻辑设备).除了端点0之外,每个端点只支持一个传 ...
- [转]在Win7 64位注册ActiveX控件
原文作者: K_H_H 原文地址: http://blog.sina.com.cn/s/blog_56b96c5a0100ztc7.html 首先必须以管理员身份运行cmd.exe,即在cmd.ex ...