[HDU 1427]速度计算24点(DFS暴力搜索)
主题连接:
pid=1427">http://acm.hdu.edu.cn/showproblem.php?pid=1427
思路:简单的DFS。dfs(sum,next,p)表示当前已经算出的值是sum,括号里算出的值是next,当前使用的卡片下标为p,实际上是把括号外和括号内的两部分值分成sum和next来处理了。
直觉告诉我们4个数仅仅须要一层括号參与运算就够了,不会也不必用多重括号改变运算顺序,因此上面的dfs思路是正确的。
那么对于下一张卡片,有两种处理方式:
1、把next算入sum中。下一张卡片成了新的括号里的算式的值。
2、把下一张卡片的值算入next中,下一张卡片增加了括号里。
对于上述两种处理方式,每种方式又分成加减乘除四种情况讨论。而对于除法这样的情况须要特殊处理,除数不能为0,并且题目中要求运算过程中不能出现小数。因此在做除法运算前须要检查。
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <string>
#include <algorithm> using namespace std; int cardNum[10]; //cardNum[i]=第i张牌的数字大小
bool flag=false; //flag=true表明能算出24点 int getNum(string s) //扑克牌编号s转数字
{
if(s[0]>='2'&&s[0]<='9') return s[0]-'0';
if(s=="10") return 10;
switch(s[0])
{
case 'A': return 1;
case 'J': return 11;
case 'Q': return 12;
case 'K': return 13;
}
} void dfs(int sum,int next,int p) //表示当前已经算出的值是sum,括号里算出的值是next,当前使用的卡片下标为p
{
if(p==4) //正在用第4张牌
{
if(sum+next==24||sum-next==24||sum*next==24)
flag=true;
if(next!=0&&sum%next==0&&sum/next==24)
flag=true;
return;
}
//1、不加括号
dfs(sum+next,cardNum[p+1],p+1);
dfs(sum-next,cardNum[p+1],p+1);
dfs(sum*next,cardNum[p+1],p+1);
if(next!=0&&sum%next==0)
dfs(sum/next,cardNum[p+1],p+1);
//2、加括号。则须要改变运算顺序
dfs(sum,next+cardNum[p+1],p+1);
dfs(sum,next-cardNum[p+1],p+1);
dfs(sum,next*cardNum[p+1],p+1);
if(cardNum[p+1]!=0&&next%cardNum[p+1]==0)
dfs(sum,next/cardNum[p+1],p+1);
} int main()
{
string in;
while(cin>>in)
{
flag=false;
cardNum[1]=getNum(in);
for(int i=2;i<=4;i++)
{
cin>>in;
cardNum[i]=getNum(in);
}
sort(cardNum+1,cardNum+5);
do
{
dfs(cardNum[1],cardNum[2],2);
}while(!flag&&next_permutation(cardNum+1,cardNum+5));
if(flag)
printf("Yes\n");
else
printf("No\n");
}
return 0;
}
[HDU 1427]速度计算24点(DFS暴力搜索)的更多相关文章
- hdu 1427 速算24点 dfs暴力搜索
速算24点 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Problem De ...
- hdu 1427 速算24点【暴力枚举】
速算24点 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submi ...
- hdu 1427 速算24点
题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=1427 速算24点 Description 速算24点相信绝大多数人都玩过.就是随机给你四张牌,包括A( ...
- HDU 1427 速算24点 (深搜)
题目链接 Problem Description 速算24点相信绝大多数人都玩过.就是随机给你四张牌,包括A(1),2,3,4,5,6,7,8,9,10,J(11),Q(12),K(13).要求只用' ...
- ACM: Gym 100935G Board Game - DFS暴力搜索
Board Game Time Limit:2000MS Memory Limit:65536KB 64bit IO Format:%I64d & %I64u Gym 100 ...
- hdu 4740 The Donkey of Gui Zhou(暴力搜索)
题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=4740 [题意]: 森林里有一只驴和一只老虎,驴和老虎互相从来都没有见过,各自自己走过的地方不能走第二次 ...
- HDU 1427 速算24点【数值型DFS】
速算24点 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submi ...
- UVALive 5107 dfs暴力搜索
题目链接:A hard Aoshu Problem DES:给三个字符串,包含的字符是A-E范围内的.长度都不超过8.每个字符可以而且只可以匹配一个数字.两个字符不能匹配相同的数字.前两个式子之间可以 ...
- UVALive 5844 dfs暴力搜索
题目链接:UVAive 5844 Leet DES:大意是给出两个字符串.第一个字符串里的字符可以由1-k个字符代替.问这两个字符串是不是相等.因为1<=k<=3.而且第一个字符串长度小于 ...
随机推荐
- android onKeydown
package wyf.ytl; import android.app.Activity; import android.content.Context; import android.os.Bund ...
- H面试程序(4):翻转句子中单词的顺序 .
题目:输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变. 句子中单词以空格符隔开.为简单起见,标点符号和普通字母一样处理. 例如输入“I am a student.”,则输出“stude ...
- [置顶] Vim用正则表达式进行批量修改
vim可以设置 magic 这个东西, magic就是设置哪些元字符要加反斜杠哪些不用加的. 简单来说: magic(\m):除了 $ . * ^ 之外其他元字符都要加反斜杠. nomagic(\M) ...
- VMWARE安装MAC时无法移动鼠标?
1.先不要怀疑你的软件 2.查看你的硬件设置 3.什么?你把USB去除了? 4.给我加回来!!! 5.OK!鼠标可以移动了!
- hadoop源码下载地址
http://svn.apache.org/repos/asf/hadoop/common/branches/
- Open Source RTOS
http://www.osrtos.com/ Name License Platforms Description Last updated FreeRTOS Modified GPL MSP ...
- POJ 3974 最长回文字串(manacher算法)
题意:给出一个字符串,求出最长回文字串. 思路:一开始我直接上了后缀数组DC3的解法,然后MLE了.看了DISCUSS发现还有一种计算回文字串更加优越的算法,就是manacher算法.就去学习了一下, ...
- ZeroClipboard插件:兼容各浏览器网页复制功能
常规利用JS编写的网页复制功能只对IE有效,无法做到兼容其它浏览器,代码如下: function copyToClipBoard(){ var clipBoardContent="" ...
- Spring Framework AOP具体解释
此前对于AOP的使用仅限于声明式事务,除此之外在实际开发中也没有遇到过与之相关的问题.近期项目中遇到了下面几点需求,细致思考之后,认为採用AOP来解决.一方面是为了以更加灵活的方式来解决这个问题,还有 ...
- 贪心算法-找零钱(C#实现)
找零钱这个问题很清楚,无非就是始终拿可以取的最大面值来找,最后就使得张数最小了,这个实现是在假设各种面值足够多的情况下. 首先拖出一个界面来,最下面是一个listbox控件 对应的代码:问题比较简单, ...