【DFS】算24点

[tyvj2802/RQNOJ74]算24点

描述

  几十年前全世界就流行一种数字游戏,至今仍有人乐此不疲.在中国我们把这种游戏称为“算24点”。您作为游戏者将得到4个1~9之间的自然数作为操作数,而您的任务是对这4个操作数进行适当的算术运算,要求运算结果等于24。 
  您可以使用的运算只有:+,-,*,/,您还可以使用()来改变运算顺序。注意:所有的中间结果须是整数,所以一些除法运算是不允许的(例如,(2*2)/4是合法的,2*(2/4)是不合法的)。下面我们给出一个游戏的具体例子: 
  若给出的4个操作数是:1、2、3、7,则一种可能的解答是1+2+3*7=24。计算过程: 
  2+1=3 
  7*3=21 
  21+3=24 
  本题不要求输出具体计算过程。

输入格式

  只有一行,四个1到9之间的自然数。

输出格式

  如果有解的话,只要输出“yes”。如果没有解则输出“no”。 
  注意:不要输出引号“”。

测试样例1

输入

1 2 3 7

输出

yes

试题分析:这道题看着简单,其实背后的反例要考虑周全。如:6 8 2 1:(6*8)/(2*1)=24

针对这种情况,我们要怎么办呢?难道用两个DFS合并为一个答案?

显然不是,只要用我们枚举到的a[i]/ans或a[i]-ans,a[i]*ans就可以了。(ans为当前DFS到的答案)

为什么这样做呢?这样单纯的a[i]/ans,那么上面那种两个组合相除的情况怎么办?

我们发现,当格式为上面的情况,我们只需要以8/(2*1)*6来DFS就好了

那万一a/(b*c)除不尽怎么办?   用double就好了……当DFS到最后一个时,会把它乘回整数的

代码:

#include<iostream>
#include<cstring>
#include<cstdio>
#include<queue>
#include<stack>
#include<vector>
#include<algorithm>
//#include<cmath>

using namespace std;
const int INF = 9999999;
#define LL long long

inline int read(){
	int x=0,f=1;char c=getchar();
	for(;!isdigit(c);c=getchar()) if(c==‘-‘) f=-1;
	for(;isdigit(c);c=getchar()) x=x*10+c-‘0‘;
	return x*f;
}
int N,M;
int a[5];
char c;
bool vis[5];
bool t[5];
double sum[40];
bool aflag=false;
void dfs(int st,double ans){
	if(st==4&&ans==24){
		puts("yes");
	    aflag=true;
	    exit(0);
	}
	else if(st==4) return ;
	for(int i=1;i<=4;i++) t[i]=vis[i];
	for(int i=1;i<=4;i++){
		int tmp=4,su=0;
		if(vis[i]) continue;
		vis[i]=true;
		dfs(st+1,ans+a[i]);
		dfs(st+1,ans-a[i]);
		if(ans!=0) dfs(st+1,ans/a[i]);
		if(ans!=0) dfs(st+1,ans*a[i]);
		if(ans!=0&&a[i]>ans) dfs(st+1,a[i]/ans);
		if(sum[i]>ans) dfs(st+1,a[i]-ans);
		vis[i]=false;
	}
}
int main(){
	//freopen(".in","r",stdin);
	//freopen(".out","w",stdout);
	for(int i=1;i<=4;i++){
		cin>>c;
		if(c==‘A‘) a[i]=1;
		else if(c==‘J‘) a[i]=11;
		else if(c==‘Q‘) a[i]=12;
		else if(c==‘K‘) a[i]=13;
		else a[i]=c-‘0‘;
	}
	dfs(0,0);
	if(!aflag) puts("no");
	return 0;
}

  

时间: 2024-12-27 13:36:33

【DFS】算24点的相关文章

Hdoj 1427 速算24点 【DFS】

速算24点 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 3574    Accepted Submission(s): 869 Problem Description 速算24点相信绝大多数人都玩过.就是随机给你四张牌,包括A(1),2,3,4,5,6,7,8,9,10,J(11),Q(12),K(13).要求只用'+','-','

HDU 1427 速算24点【数值型DFS】

速算24点 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 2562    Accepted Submission(s): 606 Problem Description 速算24点相信绝大多数人都玩过.就是随机给你四张牌,包括A(1),2,3,4,5,6,7,8,9,10,J(11),Q(12),K(13).要求只用'+','-','*

hdu 1427 速算24点 dfs暴力搜索

速算24点 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Problem Description 速算24点相信绝大多数人都玩过.就是随机给你四张牌,包括A(1),2,3,4,5,6,7,8,9,10,J(11),Q(12),K(13).要求只用'+','-','*','/'运算符以及括号改变运算顺序,使得最终运算结果为24(每个数必须且仅能用一次).游戏很简单,但遇到无解的

TOJ 1344 速算24点(全排列+dfs)

描述 速算24点相信绝大多数人都玩过.就是随机给你四张牌,包括A(1),2,3,4,5,6,7,8,9,10,J(11),Q(12),K(13).要求只用'+','-','*','/'运算符以及括号改变运算顺序,使得最终运算结果为24(每个数必须且仅能用一次).游戏很简单,但遇到无解的情况往往让人很郁闷.你的任务就是针对每一组随机产生的四张牌,判断是否有解.我们另外规定,整个计算过程中都不能出现小数. 输入 每组输入数据占一行,给定四张牌. 输出 每一组输入数据对应一行输出.如果有解则输出"Ye

【dfs套dfs套dfs】算24点

Luogu P1236 算24点 值得纪念一下 1 #include<cstdio> 2 #include<iostream> 3 #define ri register int 4 #define ll long long 5 using namespace std; 6 int a, b, c, d; 7 int ans[20]; 8 char s[5]; 9 bool flag = 0; 10 bool dfs3(int x, int y) { 11 if(x < y)

洛谷P1236 算24点

题目描述 几十年前全世界就流行一种数字游戏,至今仍有人乐此不疲.在中国我们把这种游戏称为“算24点”.您作为游戏者将得到4个1~9之间的自然数作为操作数,而您的任务是对这4个操作数进行适当的算术运算,要求运算结果等于24. 您可以使用的运算只有:+,-,*,/,您还可以使用()来改变运算顺序.注意:所有的中间结果须是整数,所以一些除法运算是不允许的(例如,(2*2)/4是合法的,2*(2/4)是不合法的).下面我们给出一个游戏的具体例子: 若给出的4个操作数是:1.2.3.7,则一种可能的解答是

hdu1427 速算24点

</pre><pre> //#pragma comment(linker, "/STACK:102400000,102400000") //HEAD #include <cstdio> #include <cstring> #include <vector> #include <iostream> #include <algorithm> #include <queue> #include

Problem A: 速算24点

Description 速算24点相信绝大多数人都玩过.就是随机给你四张牌,包括 A(1),2,3,4,5,6,7,8,9,10,J(11),Q(12),K(13).要求只用'+','-','*','/'运算符以及括号改变运算 顺序,使得最终运算结果为24(每张牌必须且仅能用一次).游戏很简单,但遇到无解的情况往往让人很郁闷.你的任务就是针对每一组随机产生的四张牌,判断 是否有解.我们另外规定,整个计算过程中都不能出现小数. Input 输入数据占一行,给定四张牌. Output 如果有解则输出

速算24点问题

问题: 速算24点相信绝大多数人都玩过.就是随机给你四张牌,包括A(1),2,3,4,5,6,7,8,9,10,J(11),Q(12),K(13).要求只用'+','-','*','/'运算符以及括号改变运算顺序,使得最终运算结果为24(每个数必须且仅能用一次).游戏很简单,但遇到无解的情况往往让人很郁闷.你的任务就是针对每一组随机产生的四张牌,判断是否有解.我们另外规定,整个计算过程中都不能出现小数. 回答: #include<iostream>      #include<cstdi