题目链接: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. oracle rac 安装脚本

    1. 配置/etc/hosts 网络 192.168.1.111 rac1 rac1.oracle.com192.168.1.182 rac1-vip 192.168.1.222 rac2 rac2. ...

  2. VS2013 快捷键 VS RESHARPER 设置

    一直用Resharper插件,最近发现Ctrl+E,C快捷见被Resharper的快捷功能吞掉了,折腾了几小时终于找到解决方法了,特记分享之. 采用如下步骤可以让快捷键回到vs2012的默认方式,同时 ...

  3. poj2175

    鸣谢: http://www.cppblog.com/y346491470/articles/152317.html [题意]:一个城市有n座建筑物,每个建筑物里面有一些人,为了在战争爆发时这些人都可 ...

  4. IIS发布网站:CS0016: 未能写入输出文件的解决方法

    “/”应用程序中的服务器错误.-------------------------------------------------------------------------------- 编译错误 ...

  5. 单例模式java实现

    package Counter; public class Counter {     private int counter;     private static Counter instance ...

  6. python之单例设计模式

    设计模式之单例模式 单例设计模式是怎么来的?在面向对象的程序设计中,当业务并发量非常大时,那么就会出现重复创建相同的对象,每创建一个对象就会开辟一块内存空间,而这些对象其实是一模一样的,那么有没有办法 ...

  7. Foreach & add remove elements

    参考 http://stackoverflow.com/questions/11058384/how-to-delete-specific-array-elements-from-within-a-f ...

  8. director.js教程

    directive.js 初始化和注册路由 director.js 的主要对象是Router对象,构造方法如下: var router = new Router(routes); //routes为路 ...

  9. 转: when.js原理和核心实现

    这篇文章可以看作是屈屈同学关于when.js的文章<异步编程:When.js快速上手>的续篇. 屈屈的文章中详细介绍了when.js,在这里关于when.js的使用我就不多复述了,大家可以 ...

  10. Android SDK与API版本的对应关系

    看教程.开发Android程序等很多地方,需要设置Android SDK的版本,而其要我们写的却是API版本的数字, 为了方便查看 Android SDK与API版本的对应关系 我在SDK Manag ...