题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1427

思路分析:

题目要求判断是否存在一种运算组合使得4个数的计算结果为24,因为搜索的层次为3层,不需要选择出最短的路径,采用dfs更有效;

拓展状态时,从当前状态拥有的数中选取两个进行某种运算(因为两个数之间存在大小关系,所以对于除法与减法来说,运算顺序一定,

大的数为被减数或被除数;加法与乘法具有交换律,相对顺序没有影响),如果可以进行运算且运算结果满足题目要求,则该状态可以

拓展,如此拓展状态,直到检测到存在一种可能的运算顺序使运算结果为24。

代码如下:

#include <iostream>
#include <cmath>
using namespace std; struct Cards
{
int num[];
int len;
}; int Max(int lhs, int rhs) { return lhs > rhs ? lhs : rhs; }
int Min(int lhs, int rhs) { return lhs > rhs ? rhs : lhs; }
double Calculate(int i, int t_lhs, int t_rhs, bool &ok)
{
int lhs, rhs; lhs = Max(t_lhs, t_rhs);
rhs = Min(t_lhs, t_rhs);
if (i == ) return lhs + rhs;
if (i == ) return lhs - rhs;
if (i == ) return lhs * rhs;
if (i == )
{
if (rhs != && lhs >= rhs && lhs % rhs == )
return lhs / rhs;
else
{
ok = false;
return ;
}
}
} void dfs(Cards start, bool &find_ans)
{
if (start.len == )
{
if (start.num[] == )
find_ans = true;
return;
}
else
{
int len = start.len; for (int i = ; i < len; ++i)
{
for (int j = i + ; j < len; ++j)
{
int count = ;
int lhs = start.num[i];
int rhs = start.num[j];
Cards next; for (int k = ; k < len; ++k)
{
if (k != i && k != j)
next.num[count++] = start.num[k];
}
next.len = count + ; for (int k = ; k < ; ++k)
{
bool ok = true;
double result = Calculate(k, lhs, rhs, ok); if (find_ans)
return;
if (!ok || result != (int)result)
continue;
next.num[count] = result;
dfs(next, find_ans);
}
}
}
}
} int StrToInt(char *s)
{
int result = ;
if (s[] == 'A') result = ;
else if (s[] == 'J') result = ;
else if (s[] == 'Q') result = ;
else if (s[] == 'K') result = ;
else if (s[] == '' && s[] == '') result = ;
else result = s[] - ''; return result;
} int main()
{
Cards start;
bool find_ans;
char temp[]; while (scanf("%s", &temp) != EOF)
{
find_ans = false;
start.len = ;
start.num[] = StrToInt(temp);
for (int i = ; i < ; ++i)
{
scanf("%s", &temp);
start.num[i] = StrToInt(temp);
} dfs(start, find_ans);
if (find_ans)
cout << "Yes\n";
else
cout << "No\n";
}
return ;
}

HDOJ 1427(dfs) 速算24点的更多相关文章

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

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

  2. HDU 1427 速算24点【数值型DFS】

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

  3. hdu 1427 速算24点

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

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

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

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

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

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

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

  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. hdu1427之速算24点

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

  9. 【DFS】算24点

    [tyvj2802/RQNOJ74]算24点 描述 几十年前全世界就流行一种数字游戏,至今仍有人乐此不疲.在中国我们把这种游戏称为“算24点”.您作为游戏者将得到4个1~9之间的自然数作为操作数,而您 ...

随机推荐

  1. iOS RTMP 视频直播开发笔记(1) – 采集摄像头图像

    1. 采集硬件(摄像头)视频图像 这里简单说下 iOS 的摄像头采集. 首先初始化AVCaptureSession,说到Session,有没有人想到AVAudioSession呢? // 初始化 AV ...

  2. SQL Server中 sysobjects、syscolumns、systypes

    1.sysobjects    系统对象表. 保存当前数据库的对象,如约束.默认值.日志.规则.存储过程等 在大多数情况下,对你最有用的两个列是Sysobjects.name和Sysobjects.x ...

  3. Unity5UGUI 官方教程学习笔记(一)Canvas

    Canvas Canvas是控制一组UI元素将被渲染 所有的UI元素必须是Canvas下的子物体 一个场景中可以拥有多个Canvas 在创建UI元素时,如果没有Canvas,将会自动创建Canvas ...

  4. Convert Sorted List to Balanced Binary Search Tree (BST)

    (http://leetcode.com/2010/11/convert-sorted-list-to-balanced-binary.html) Given a singly linked list ...

  5. 关于Connection must be valid and open.

    这个Bug真心很操蛋! 我的网站在公司做的运行一切都没问题,回家后咋自己的电脑上出现了Connection must be valid and open.这个问题. 我最后还是在英文网站的一个不起眼的 ...

  6. Java文本编辑器中遇到的问题详解

    今天介绍文件的读取和写入,分别用FileReader,FileWriter 1,FileWriter类(字符输出流类) 构造方法:FileWriter fw = new FileWriter(Stri ...

  7. VS2015如何另存解决方案文件-修改解决方案sln文件的路径

    原文:VS2005如何另存解决方案文件-修改解决方案sln文件的路径 修改解决方案sln文件的路径 方法一:工具→选项→项目和解决方案,可设置项目的默认保存位置.方法二:"解决方案资源管理器 ...

  8. java.lang.RuntimeException: Unable to start activity ComponentInfo

    异常:java.lang.RuntimeException: Unable to start activity ComponentInfo{com.william/com.william.Result ...

  9. rsyslog 基本组成

    Facility 定义日志消息的来源,以方便对日志进行分类,facility 有以下几种: --kern 内核消息 --user 用户级消息 --mail 邮件系统消息 --daemon 系统服务消息 ...

  10. Java知识点复习

    总结下java的知识点 final 关键字-方法:不能被子类重写(override)-变量:不能被修改-类:不可以被继承,派生子类 finally 关键字与try/catch语句配合使用,即使有异常抛 ...