博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
HDOJ 1427(dfs) 速算24点
阅读量:4993 次
发布时间:2019-06-12

本文共 2749 字,大约阅读时间需要 9 分钟。

题目链接:

思路分析:

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

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

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

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

 

代码如下:

#include 
#include
using namespace std;struct Cards{ int num[4]; 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 == 0) return lhs + rhs; if (i == 1) return lhs - rhs; if (i == 2) return lhs * rhs; if (i == 3) { if (rhs != 0 && lhs >= rhs && lhs % rhs == 0) return lhs / rhs; else { ok = false; return 0; } }}void dfs(Cards start, bool &find_ans){ if (start.len == 1) { if (start.num[0] == 24) find_ans = true; return; } else { int len = start.len; for (int i = 0; i < len; ++i) { for (int j = i + 1; j < len; ++j) { int count = 0; int lhs = start.num[i]; int rhs = start.num[j]; Cards next; for (int k = 0; k < len; ++k) { if (k != i && k != j) next.num[count++] = start.num[k]; } next.len = count + 1; for (int k = 0; k < 4; ++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 = 0; if (s[0] == 'A') result = 1; else if (s[0] == 'J') result = 11; else if (s[0] == 'Q') result = 12; else if (s[0] == 'K') result = 13; else if (s[0] == '1' && s[1] == '0') result = 10; else result = s[0] - '0'; return result;}int main(){ Cards start; bool find_ans; char temp[5]; while (scanf("%s", &temp) != EOF) { find_ans = false; start.len = 4; start.num[0] = StrToInt(temp); for (int i = 1; i < 4; ++i) { scanf("%s", &temp); start.num[i] = StrToInt(temp); } dfs(start, find_ans); if (find_ans) cout << "Yes\n"; else cout << "No\n"; } return 0;}

 

转载于:https://www.cnblogs.com/tallisHe/p/4498822.html

你可能感兴趣的文章
Python Day04
查看>>
Android新增API之AudioEffect中文API与应用实例
查看>>
颜色空间RGB与HSV(HSL)的转换
查看>>
swift 用协议实现代理传值功能
查看>>
深入懂得android view 生命周期
查看>>
android.widget.FrameLayout$LayoutParams cannot be cast to android.widget.LinearLayout$LayoutParams
查看>>
Android 中 更新视图的函数ondraw() 和dispatchdraw()的区别
查看>>
《Java源码解析》之NIO的Selector机制(Part1:Selector.open())
查看>>
webpack安装问题
查看>>
Qt学习记录--Qt::CaseSensitive
查看>>
你的灯还亮着吗阅读笔记之一
查看>>
python介绍
查看>>
Unity-Editor按钮和菜单显示
查看>>
SharePoint InfoPath 保存无法发布问题
查看>>
word2vec:主要概念和流程
查看>>
Java - MyBites 逆向工程
查看>>
104. Maximum Depth of Binary Tree
查看>>
Python--变量作用域
查看>>
2017-2018-1 20155235 《信息安全系统设计基础》第九周学习总结
查看>>
!!和??
查看>>