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 函数讲解
函数 来自<JavaScript 标准参考教程(alpha)>,by 阮一峰 目录 概述 函数的声明 函数的重复声明 圆括号运算符,return 语句和递归 第一等公民 函数名的提升 不能 ...
- Redis 基础:Redis 数据类型
Redis 数据类型 Redis支持五种数据类型:string(字符串).hash(哈希).list(列表).set(集合)及zset(sorted set:有序集合). String(字符串) st ...
- PGM学习之五 贝叶斯网络
本文的主题是“贝叶斯网络”(Bayesian Network) 贝叶斯网络是一个典型的图模型,它对感兴趣变量(variables of interest)及变量之间的关系(relationships) ...
- A Chess Game HDU - 1524 (有向图博弈)
题意:在一个有向无环图上有n个顶点,每一个顶点都只有一个棋子,有两个人,每次根据这个图只能将任意一颗棋子移动一步 ,如果到某一步玩家不能移动时,那么这个人就输. 分析:本题是最典型的有向无环图的博弈, ...
- Google题解
Kickstart2017 RoundB B.题意: 二维平面上有n个点, 每个点坐标(xi, yi), 权值wi, 问: 在平面上找一点p, 使得 Σwi*max(|X-xi|, |Y-yi|)最小 ...
- Timing wheel心跳机制
在web服务中,断开空闲连接是一种减少资源浪费的一种手段,由此就有了心跳机制来判断一个连接是否空闲. 一种简单粗暴的方式: 1. 服务端每个连接保存一个最后一次操作的时间戳,每次这个连接对应fd可读时 ...
- 【NOIP&NOI】飞扬的小鸟 Flappy Bird
描述 Flappy Bird 是一款风靡一时的休闲手机游戏.玩家需要不断控制点击手机屏幕的频率来调节小鸟的飞行高度,让小鸟顺利通过画面右方的管道缝隙.如果小鸟一不小心撞到了水管或者掉在地上的话,便宣告 ...
- 【转】64位Ubuntu 16.04搭建嵌入式交叉编译环境arm-linux-gcc过程图解
64位Ubuntu 16.04搭建嵌入式交叉编译环境arm-linux-gcc过程图解,开发裸机环境之前需要先搭建其开发环境,毕竟工欲善其事必先利其器嘛. 安装步骤 1.准备工具安装目录 下载 ar ...
- 【bzoj4542】 Hnoi2016—大数
http://www.lydsy.com/JudgeOnline/problem.php?id=4542 (题目链接) 题意 给出一个素数$P$,一个数串$S$,$m$个询问,每次询问区间$[l,r] ...
- 【DP】【CF1099C】 Postcard
Description 给定一个长度为 \(n\) 的字符串,尽可能包含小写字母,字符 '?' 和字符 '*'.保证上面两种特殊字符若出现则一定出现在一个小写字母的后面一位.要求构造一个长度为 \(k ...