速算24点

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 2562    Accepted Submission(s): 606

Problem Description
速算24点相信绝大多数人都玩过。就是随机给你四张牌,包括A(1),2,3,4,5,6,7,8,9,10,J(11),Q(12),K(13)。要求只用'+','-','*','/'运算符以及括号改变运算顺序,使得最终运算结果为24(每个数必须且仅能用一次)。游戏很简单,但遇到无解的情况往往让人很郁闷。你的任务就是针对每一组随机产生的四张牌,判断是否有解。我们另外规定,整个计算过程中都不能出现小数。
 
Input
每组输入数据占一行,给定四张牌。
 
Output
每一组输入数据对应一行输出。如果有解则输出"Yes",无解则输出"No"。
 
Sample Input
A 2 3 6
3 3 8 8
 
Sample Output
Yes
No
【分析】:

简单的DFS,dfs(sum,next,p)表示当前已经算出的值是sum,括号中算出的值是next,当前使用的卡片下标为p,实际上是把括号外和括号内的两部分值分成sum和next来处理了。

直觉告诉我们4个数只需要一层括号参与运算就够了,不会也不必用多重括号改变运算顺序,因此上面的dfs思路是正确的。

那么对于下一张卡片,有两种处理方式:

1、把next算入sum中,下一张卡片成了新的括号中的算式的值。

2、把下一张卡片的值算入next中,下一张卡片加入了括号中。

这道题直接暴力有点不和谐,所以可以用next_permutation()来做,总结一下,其实所有运算都可以归结为两类,一类是( ( a@b) @c) @d 另一类是 ( a@b ) @ (c@d) 因为只有四个数,所以这么做没问题,但当操作数增多的时候就有点麻烦了,这时候可以考虑递归来做

对于上述两种处理方式,每种方式又分成加减乘除四种情况讨论,而对于除法这种情况需要特殊处理,除数不能为0,而且题目中要求运算过程中不能出现小数,因此在做除法运算前需要检查。

【代码】:

#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <string>
#include <algorithm> using namespace std; int cardNum[]; //cardNum[i]=第i张牌的数字大小
bool flag=false; //flag=true表明能算出24点 int getNum(string s) //扑克牌编号s转数字
{
if(s[]>=''&&s[]<='') return s[]-'';
if(s=="") return ;
switch(s[])
{
case 'A': return ;
case 'J': return ;
case 'Q': return ;
case 'K': return ;
}
} void dfs(int sum,int next,int p) //表示当前已经算出的值是sum,括号中算出的值是next,当前使用的卡片下标为p
{
if(p==) //正在用第4张牌
{
if(sum+next==||sum-next==||sum*next==)
flag=true;
if(next!=&&sum%next==&&sum/next==)
flag=true;
return;
}
//1、不加括号
dfs(sum+next,cardNum[p+],p+);
dfs(sum-next,cardNum[p+],p+);
dfs(sum*next,cardNum[p+],p+);
if(next!=&&sum%next==)
dfs(sum/next,cardNum[p+],p+);
//2、加括号,则需要改变运算顺序
dfs(sum,next+cardNum[p+],p+);
dfs(sum,next-cardNum[p+],p+);
dfs(sum,next*cardNum[p+],p+);
if(cardNum[p+]!=&&next%cardNum[p+]==)
dfs(sum,next/cardNum[p+],p+);
} int main()
{
string in;
while(cin>>in)
{
flag=false;
cardNum[]=getNum(in);
for(int i=;i<=;i++)
{
cin>>in;
cardNum[i]=getNum(in);
}
sort(cardNum+,cardNum+);
do
{
dfs(cardNum[],cardNum[],);
}while(!flag&&next_permutation(cardNum+,cardNum+));
if(flag)
printf("Yes\n");
else
printf("No\n");
}
return ;
}

数值型DFS

HDU 1427 速算24点【数值型DFS】的更多相关文章

  1. hdu 1427 速算24点

    题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=1427 速算24点 Description 速算24点相信绝大多数人都玩过.就是随机给你四张牌,包括A( ...

  2. hdu 1427 速算24点【暴力枚举】

    速算24点 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submi ...

  3. hdu 1427 速算24点 dfs暴力搜索

    速算24点 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Problem De ...

  4. HDU 1427 速算24点 (深搜)

    题目链接 Problem Description 速算24点相信绝大多数人都玩过.就是随机给你四张牌,包括A(1),2,3,4,5,6,7,8,9,10,J(11),Q(12),K(13).要求只用' ...

  5. 24点游戏&&速算24点(dfs)

    24点游戏 Time Limit: 3000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) Submit Sta ...

  6. hdu1427之速算24点

    速算24点 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Subm ...

  7. Hdu1427 速算24点 2017-01-18 17:26 46人阅读 评论(0) 收藏

    速算24点 Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 65536/32768K (Java/Other) Total Submiss ...

  8. HDU 1015 Safecracker【数值型DFS】

    Safecracker Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total ...

  9. HDOJ 1427(dfs) 速算24点

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1427 思路分析: 题目要求判断是否存在一种运算组合使得4个数的计算结果为24,因为搜索的层次为3层,不 ...

随机推荐

  1. mii-tool与ethtool的用法详解

    mii-tool与ethtool的用法详解 1.mii-tool 配置网络设备协商方式的工具: 感谢原文作者!原文地址:http://blog.chinaunix.net/uid-20639775-i ...

  2. [bzoj2893] 集合计数

    Description 一个有N个元素的集合有2^N 个不同子集(包含空集),现在要在这2^N个集合中取出若干集合(至少一个),使得 它们的交集的元素个数为K,求取法的方案数,答案模100000000 ...

  3. 雅礼集训 Day3 T3 w 解题报告

    w 题目背景 \(\frac 14\)遇到了一道水题,双完全不会做,于是去请教小\(\text{D}\).小\(\text{D}\)看了\(0.607^2\)眼就切掉了这题,嘲讽了\(\frac 14 ...

  4. vue中使用 echarts3.0 或 echarts2.0 (模拟迁徙图,折线图)

    一.echarts3.0(官网: http://echarts.baidu.com/) 首先通过npm安装echarts依赖,安装的为3.0版本 npm install echarts -s 也可以使 ...

  5. 使用state模块部署lamp架构

    install_httpd: pkg.installed: - name: httpd httpd_running: service.running: - name: httpd - enable: ...

  6. 使用apache构建OpenStack内部yum源

    安装apache yum install httpd -y 上传openstack-mitaka-rpms.tar包,链接:http://pan.baidu.com/s/1kVA1wKv 密码:q26 ...

  7. bzoj 5010: [Fjoi2017]矩阵填数

    Description 给定一个 h*w 的矩阵,矩阵的行编号从上到下依次为 1..h,列编号从左到右依次1..w.在这个矩阵中你需要在每 个格子中填入 1..m 中的某个数.给这个矩阵填数的时候有一 ...

  8. Mysql TEXT类型长度

    BLOBTEXT一个BLOB或TEXT列,最大长度为65535(2^16-1)个字符. MEDIUMBLOBMEDIUMTEXT一个BLOB或TEXT列,最大长度为16777215(2^24-1)个字 ...

  9. locust===Writing a locustfile

    The Locust class A locust class represents one user (or a swarming locust if you will). Locust will ...

  10. git放弃本地commit,未push

    如果不小心commit了一个不应该commit的修改,但是还没有push,想撤销那个commit. 步骤: a) git log:获取commit id: b) git reset --hard co ...