24点游戏&&速算24点(dfs)
24点游戏
Time Limit: 3000/1000MS (Java/Others) Memory Limit: 65535/65535KB (Java/Others)
2424点就是给你一串数字,问你是否通过加减乘除括号构成2424点。
沈爷觉得这个很好玩,就决定考考你,给你44个数,可以交换位置,可以用加减乘除和括号,是否能构成2424点呢?
注意哦~这里的除法并不是整数除法,比如样例
Input
第一行TT,表示有多少组测试数据,1≤T≤501≤T≤50
接下来TT行,每行44个正整数a1a1, a2a2, a3a3, a4a4,表示每个数都是多少,1≤ai≤131≤ai≤13
Output
对于每一次询问,如果能够凑成2424点,输出yes
,否则输出no
Sample input and output
Sample Input | Sample Output |
---|---|
2 |
yes |
Hint
33 33 88 88
就可以构造出 8÷(3–8÷3)=24
题解:求24点,暴力搜索下就好,刚开始我想着全排列下,然后按照顺序来进行,但是思路明显不完善,然后看了大神的,
大神是延长数组存放当前运算的解,vis记录是否用过,思路很巧妙;很简单就A过了;
代码:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<map>
#include<string>
#include<vector>
using namespace std;
const int INF=0x3f3f3f3f;
#define SI(x) scanf("%d",&x)
#define PI(x) printf("%d",x)
#define P_ printf(" ")
#define mem(x,y) memset(x,y,sizeof(x))
typedef long long LL;
int flot;
double a[];
int vis[];
/*void dfs(int pos,double cur);
void ary(int num){
if(flot)return;
if(num==4){
// for(int i=0;i<4;i++)printf("%d ",ans[i]);puts("");
dfs(1,ans[0]);
return;
}
for(int i=0;i<4;i++){
if(vis[i])continue;
ans[num]=a[i];
vis[i]=1;
ary(num+1);
vis[i]=0;
}
}
*/
void dfs(int usd,int tp){
if(flot)return;
if(usd==){
if(abs(a[tp-]-)<1e-)flot=;
return;
}
/*
dfs(pos+1,cur+ans[pos]);
dfs(pos+1,cur-ans[pos]);
dfs(pos+1,cur*ans[pos]);
dfs(pos+1,cur/ans[pos]);
dfs(pos+1,-cur*ans[pos]);
dfs(pos+1,-cur/ans[pos]);
dfs(pos+1,ans[pos]/cur);
dfs(pos+1,ans[pos]/cur);
*/
for(int i=;i<tp;i++){
if(vis[i])continue;
vis[i]=;
for(int j=i+;j<tp;j++){
if(vis[j])continue;
vis[j]=;
a[tp]=a[i]+a[j];dfs(usd+,tp+);
a[tp]=a[i]*a[j];dfs(usd+,tp+);
a[tp]=a[i]-a[j];dfs(usd+,tp+);
a[tp]=a[j]-a[i];dfs(usd+,tp+);
if(a[i]!=){
a[tp]=a[j]/a[i];dfs(usd+,tp+);
}
if(a[j]!=){
a[tp]=a[i]/a[j];dfs(usd+,tp+);
}
vis[j]=;
}
vis[i]=;
}
}
int main(){
int T;
SI(T);
while(T--){
for(int i=;i<;i++)scanf("%lf",&a[i]);
flot=;
mem(vis,);
dfs(,);
if(flot)puts("yes");
else puts("no");
}
return ;
}
速算24点
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 4250 Accepted Submission(s): 1044
3 3 8 8
No
题解:跟上题不同的是,这个是字符输入,而且,是整除的;注意10的读入。。。
虽然写过,但是比赛出到还是不会。。。这个题思路就是dfs,a[tp - 1]代表当前usd的个数的计算值。
代码:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<queue>
using namespace std;
int a[];
int vis[];
int ans;
void dfs(int usd, int tp){
if(ans)return;
if(usd == ){
if(a[tp - ] == )ans = ;
return;
}
for(int i = ; i < tp; i++){
if(vis[i])continue;
vis[i] = ;
for(int j = i + ; j < tp; j++){//注意应该从i + 1开始,可以让时间减少一般否则会超时;
if(vis[j])continue;
vis[j] = ;
a[tp] = a[i] + a[j];dfs(usd + , tp + );
a[tp] = a[i] - a[j];dfs(usd + , tp + );
a[tp] = a[j] - a[i];dfs(usd + , tp + );
a[tp] = a[i] * a[j];dfs(usd + , tp + ); if(a[j] != && a[i] % a[j] == ){
a[tp] = a[i] / a[j];dfs(usd + , tp + );
}
if(a[i] != && a[j] % a[i] == ){
a[tp] = a[j] / a[i];dfs(usd + , tp + );
} vis[j] = ;
}
vis[i] = ;
}
}
int main(){
char s[][];
while(~scanf("%s %s %s %s",s[],s[],s[],s[])){
for(int i =;i < ;i++){
if(strlen(s[i]) == )a[i] = ;
else if(s[i][] == 'A')a[i] = ;
else if(s[i][] == 'J')a[i] = ;
else if(s[i][] == 'Q')a[i] = ;
else if(s[i][] == 'K')a[i] = ;
else a[i] = s[i][] - '';
}
ans = ;
memset(vis, , sizeof(vis));
dfs(, );
if(ans)
puts("Yes");
else
puts("No");
}
return ;
}
24点游戏&&速算24点(dfs)的更多相关文章
- hdu 1427 速算24点
题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=1427 速算24点 Description 速算24点相信绝大多数人都玩过.就是随机给你四张牌,包括A( ...
- 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 ...
- 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 1427 速算24点 (深搜)
题目链接 Problem Description 速算24点相信绝大多数人都玩过.就是随机给你四张牌,包括A(1),2,3,4,5,6,7,8,9,10,J(11),Q(12),K(13).要求只用' ...
- hdu1427之速算24点
速算24点 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Subm ...
- hdu 1427 速算24点【暴力枚举】
速算24点 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submi ...
- HDOJ 1427(dfs) 速算24点
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1427 思路分析: 题目要求判断是否存在一种运算组合使得4个数的计算结果为24,因为搜索的层次为3层,不 ...
- hdu1427 速算24点
</pre><pre> //#pragma comment(linker, "/STACK:102400000,102400000") //HEAD #in ...
随机推荐
- Letter Combinations of a Phone Number 解答
Question Given a digit string, return all possible letter combinations that the number could represe ...
- windows多线程没那么难
windows多线程没那么难 作者:vpoet mail:vpoet_sir@163.com 上一博文中我们引入了CreateThread()多线程编程一个简单的例子,事实上我说windows 多线程 ...
- DFS(深度优先搜索)模板
void dfs()//参数用来表示状态 { if(到达终点状态) { ...//根据题意来添加 return; } if(越界或者是不符合法状态) return; for(扩展方式) { if(扩展 ...
- 喜欢的女生快被别人抢走了,我敢怎么抢? - V2EX
喜欢的女生快被别人抢走了,我敢怎么抢? - V2EX 三大定律镇楼: 第一定律:永远不要以为女生对你有好感.第二定律:告白等于见光死.第三定律:秀恩爱分得快.
- iOS 系统架构 && 常用 framework
整理自互联网,感谢原文作者! 1.iOS基于UNIX系统,因此从系统的稳定性上来说它要比其他操作系统的产品好很多 2.iOS的系统架构分为四层,由上到下一次为:可触摸层(Cocoa Touch lay ...
- Android系统匿名共享内存(Anonymous Shared Memory)C++调用接口分析
文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/6939890 在Android系统中,针对移动设 ...
- stagefright框架(一)Video Playback的流程
在Android上,預設的多媒體框架(multimedia framework)是OpenCORE. OpenCORE的優點是兼顧了跨平台的移植性,而且已經過多方驗證,所以相對來說較為穩定:但是其缺點 ...
- 关于继承扩展ASP.NET控件(以Textbox为例)
以下是一个相对简陋的扩展, 主要是针对金额显示的Textbox扩展. using System; using System.Collections.Generic; using System.Linq ...
- Mplayer ARM平台下交叉编译
下载MPlayer http://www.mplayerhq.hu/design7/dload.html 编译环境 系统 : ubuntu 11.04 交叉编译器版本 : Sourcery G++ L ...
- 天天模拟器极速畅玩靠谱游戏《仙境传说RO:复兴》
在电脑上用模拟器打开手游<仙境传说RO:复兴>,今天小编就来写一写天天模拟器的试玩教学. 首先先打开天天模拟器极速版. 在界面中找到鱼图标的靠谱游戏应用中心. 在应用中心中找到<仙境 ...