HDU 1427 速算24点 (深搜)
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
题目描述:
给定4个数字,判定这4个数字是否可以通过运算得到结果24。运算符包括:加、减、乘、除,允许变换数字的顺序,当然也可以使用括号改变运算顺序。
即:判定是否存在一种通过在下面的圆圈中添加运算符以及添加括号的方式使得等式成立:
a ○ b ○ c ○ d = 24
例如:数字 5, 5, 5, 1 可以通过运算得到结果24:
5 × (5 - 1 ÷ 5) = 24
数字 9, 9, 9, 9 则无论通过怎样的运算都无法得到24的结果。
分析:
最开始的时候想的情况比较复杂,后来发现其实对于使用小括号来改变运算顺序的话,完全可以通过改变数字的运算顺序来达到相同的目的,考虑的情况就会大大减少,因此可以采用暴力搜索的方式进行解答,枚举所有的可能的运算方式,如果有1种方案可以达到24,则表明给定的数据有解,否则无解。
枚举的方式如下:
由于加法和乘法满足交换律,而减法和除法则不满足,这里我们添加两种运算:“反减”和“反除”,分别记作 ~- 和 ~÷,此时:
a ~- b = b - a
a ~÷ b = b ÷ a
添加这两种运算操作后,就使得减法和除法也同样符合交换律。此时,所有情况的运算顺序就只有两种情况,用※表示任意的运算符,则两种运算顺序为:
((a ※ b) ※ c) ※ d)) 从左到右依次计算
((a ※ b) ※ (c ※ d)) 分别计算前两个和后两个数字的结果后,在将得到的两个结果进行运算,得到最终的结果
而其他的运算顺序均可以通过调整数字的排列顺序得到用以上两种情况表示的等价情况,例如:
(a ※ ((b ※ c) ※ d)) =====> (((b ※ c) ※ d) ※ a)
((a ※ (b ※ c)) ※ d) =====> (((b ※ c) ※ a) ※ d)
这样,通过枚举4个数字排列情况和三个位置的运算符的不同情况,就可以枚举到所有的运算情况。其中:4个数字排列,共有4!= 24种结果,而3个运算符中每个运算符都有6种不同的情况,因此共有6^3 = 216中情况,而运算顺序又有2中情况,因此,总的情况数为:
24 × 216 × 2 = 10368
由于加法和乘法本身就具有交换律,并且给定的4个数字也有某些数字相同的情况,因此,在实际枚举过程中,10368种情况会有某些是重复的。本题数据量比较小,因此重复计算的问题可以忽略。
代码:
#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<string>
#include<string.h>
using namespace std;
int num[4];
bool flag;
void dfs(int sum,int now,int times)
{
if(!flag)
return ;
if(times==3)
{
if(sum+now==24||sum-now==24||sum*now==24)
flag=false;
if(now!=0&&sum%now==0&&sum/now==24)
flag=false;
return;
}
//先计算前面的一部分
dfs(sum+now,num[times+1],times+1);
dfs(sum-now,num[times+1],times+1);
dfs(sum*now,num[times+1],times+1);
if(now!=0&&sum%now==0)
dfs(sum/now,num[times+1],times+1);
//再计算后面一部分
dfs(sum,now+num[times+1],times+1);
dfs(sum,now-num[times+1],times+1);
dfs(sum,now*num[times+1],times+1);
if(num[times+1]!=0&&now%num[times+1]==0)
dfs(sum,now/num[times+1],times+1);
}
int main()
{
char ch[6];
while(~scanf("%s",ch))
{
flag=true;
if(strlen(ch)==2)//除了数字10之外,所有的数字都是一位字符来表示的e
num[0]=10;
else
{
if(ch[0]=='A')
num[0]=1;
else if(ch[0]=='J')
num[0]=11;
else if(ch[0]=='Q')
num[0]=12;
else if(ch[0]=='K')
num[0]=13;
else num[0]=ch[0]-'0';
}
for(int i=1; i<=3; i++)
{
scanf("%s",ch);
if(strlen(ch)==2)//除了数字10之外,所有的数字都是一位字符来表示的e
num[i]=10;
else
{
if(ch[0]=='A')
num[i]=1;
else if(ch[0]=='J')
num[i]=11;
else if(ch[0]=='Q')
num[i]=12;
else if(ch[0]=='K')
num[i]=13;
else num[i]=ch[0]-'0';
}
}
sort(num,num+4);
do
{
dfs(num[0],num[1],1);
}
while(next_permutation(num,num+4)&&flag);//全排列函数来枚举四个数字的任意的顺序
if(!flag)//只要有一种情况计算出来结果
printf("Yes\n");
else
printf("No\n");
}
return 0;
}
HDU 1427 速算24点 (深搜)的更多相关文章
- hdu 1427 速算24点
题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=1427 速算24点 Description 速算24点相信绝大多数人都玩过.就是随机给你四张牌,包括A( ...
- hdu 1427 速算24点【暴力枚举】
速算24点 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submi ...
- hdu 1427 速算24点 dfs暴力搜索
速算24点 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Problem De ...
- HDU 1427 速算24点【数值型DFS】
速算24点 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submi ...
- 24点游戏&&速算24点(dfs)
24点游戏 Time Limit: 3000/1000MS (Java/Others) Memory Limit: 65535/65535KB (Java/Others) Submit Sta ...
- hdu1427之速算24点
速算24点 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Subm ...
- Hdu1427 速算24点 2017-01-18 17:26 46人阅读 评论(0) 收藏
速算24点 Time Limit : 2000/1000ms (Java/Other) Memory Limit : 65536/32768K (Java/Other) Total Submiss ...
- hdu 5648 DZY Loves Math 组合数+深搜(子集法)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5648 题意:给定n,m(1<= n,m <= 15,000),求Σgcd(i|j,i&am ...
- HDU 2553 N皇后问题 (深搜)
题目链接 Problem Description 在N*N的方格棋盘放置了N个皇后,使得它们不相互攻击(即任意2个皇后不允许处在同一排,同一列,也不允许处在与棋盘边框成45角的斜线上. 你的任务是,对 ...
随机推荐
- js ajax 经典案例
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- [转帖]NVMe到底是什么?用它的SSD有啥优势?
NVMe到底是什么?用它的SSD有啥优势? 2015-8-20 14:00 | 作者:Strike | 关键字:NVMe,SSD,PCI-E SSD,超能课堂 分享到 有关注SS ...
- Qt托盘程序
使用QSystemTrayIcon类可以实现托盘程序.在这里使用QMainWindow做实例: mainwindow.h头文件 #ifndef MAINWINDOW_H #define MAINWIN ...
- python操作mysql实例
#coding=utf-8 import MySQLdb # 打开数据库连接 db = MySQLdb.connect(host='localhost',user='root',passwd='',d ...
- 快速配置java环境变量
右键单击计算机--->属性 点击 “高级系统设置”--->"环境变量",出现环境变量设置窗口 系统变量--->新建 JAVA_HOME变量,变量值填写jdk安装路 ...
- Ubuntu实用软件安装[转]
Gedit编辑器配置 Ubuntu14.04从安装软件到卸载软件,删除安装包 linux wget 命令用法详解(附实例说明) ==================================== ...
- Vue使用SCSS进行模块化开发
原文地址:http://www.cnblogs.com/JimmyBright/p/7761531.html 个人认为scss最大的好处就是能将css属性设置为变量,这样让css一键更换主题成为可能. ...
- Spring Security OAuth 个性化token
个性化Token 目的 默认通过调用 /oauth/token 返回的报文格式包含以下参数 { "access_token": "e6669cdf-b6cd-43fe-a ...
- 【HDU4336】Card Collector(Min-Max容斥)
[HDU4336]Card Collector(Min-Max容斥) 题面 Vjudge 题解 原来似乎写过一种状压的做法,然后空间复杂度很不优秀. 今天来补一种神奇的方法. 给定集合\(S\),设\ ...
- loj2540 「PKUWC2018」随机算法 【状压dp】
题目链接 loj2540 题解 有一个朴素三进制状压\(dp\),考虑当前点三种状态:没考虑过,被选入集合,被排除 就有了\(O(n3^{n})\)的转移 但这样不优,我们考虑优化状态 设\(f[i] ...