博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
24点游戏&&速算24点(dfs)
阅读量:6909 次
发布时间:2019-06-27

本文共 3364 字,大约阅读时间需要 11 分钟。

24点游戏

Time Limit: 3000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others)
Submit
 Status

2424点就是给你一串数字,问你是否通过加减乘除括号构成2424点。

沈爷觉得这个很好玩,就决定考考你,给你44个数,可以交换位置,可以用加减乘除和括号,是否能构成2424点呢?

注意哦~这里的除法并不是整数除法,比如样例

Input

第一行TT,表示有多少组测试数据,1T501≤T≤50

接下来TT行,每行44个正整数a1a1, a2a2, a3a3, a4a4,表示每个数都是多少,1ai131≤ai≤13

Output

对于每一次询问,如果能够凑成2424点,输出yes,否则输出no

Sample input and output

Sample Input Sample Output
23 3 8 81 1 1 1
yesno

Hint

33 33 88 88

就可以构造出 8÷(38÷3)=24

题解:求24点,暴力搜索下就好,刚开始我想着全排列下,然后按照顺序来进行,但是思路明显不完善,然后看了大神的,

大神是延长数组存放当前运算的解,vis记录是否用过,思路很巧妙;很简单就A过了;

代码:

#include
#include
#include
#include
#include
#include
#include
#include
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[110];int vis[110];/*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==4){ if(abs(a[tp-1]-24)<1e-8)flot=1; 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=0;i

 

速算24点

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 4250    Accepted Submission(s): 1044

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

题解:跟上题不同的是,这个是字符输入,而且,是整除的;注意10的读入。。。

虽然写过,但是比赛出到还是不会。。。这个题思路就是dfs,a[tp - 1]代表当前usd的个数的计算值。

代码:

#include
#include
#include
#include
#include
#include
using namespace std;int a[1010];int vis[1010];int ans;void dfs(int usd, int tp){ if(ans)return; if(usd == 4){ if(a[tp - 1] == 24)ans = 1; return; } for(int i = 0; i < tp; i++){ if(vis[i])continue; vis[i] = 1; for(int j = i + 1; j < tp; j++){ //注意应该从i + 1开始,可以让时间减少一般否则会超时; if(vis[j])continue; vis[j] = 1; a[tp] = a[i] + a[j];dfs(usd + 1, tp + 1); a[tp] = a[i] - a[j];dfs(usd + 1, tp + 1); a[tp] = a[j] - a[i];dfs(usd + 1, tp + 1); a[tp] = a[i] * a[j];dfs(usd + 1, tp + 1); if(a[j] != 0 && a[i] % a[j] == 0){ a[tp] = a[i] / a[j];dfs(usd + 1, tp + 1); } if(a[i] != 0 && a[j] % a[i] == 0){ a[tp] = a[j] / a[i];dfs(usd + 1, tp + 1); } vis[j] = 0; } vis[i] = 0; }}int main(){ char s[4][4]; while(~scanf("%s %s %s %s",s[0],s[1],s[2],s[3])){ for(int i =0;i < 4;i++){ if(strlen(s[i]) == 2)a[i] = 10; else if(s[i][0] == 'A')a[i] = 1; else if(s[i][0] == 'J')a[i] = 11; else if(s[i][0] == 'Q')a[i] = 12; else if(s[i][0] == 'K')a[i] = 13; else a[i] = s[i][0] - '0'; } ans = 0; memset(vis, 0, sizeof(vis)); dfs(1, 4); if(ans) puts("Yes"); else puts("No"); } return 0;}

 

转载地址:http://bpfcl.baihongyu.com/

你可能感兴趣的文章
点名器
查看>>
Codeforces Problems-122A. Lucky Division
查看>>
移动端适配代码
查看>>
Js设置所有连接是触发/swt/的代码
查看>>
JS高级程序设计2nd部分知识要点1
查看>>
mac10.8 更新系统出错
查看>>
'-[UITableViewController loadView] loaded the "XXX" nib but didn't get a UITableView.'
查看>>
ARM裸板开发:07_IIC 通过IIC总线接口读写时钟芯片时间参数实现的总结
查看>>
C# 笔记 如何调用一个有返回值的方法
查看>>
加载静态文件,父模板的继承和扩展
查看>>
高科技犯罪:东欧ATM取款机惊现木马!
查看>>
黑客大赛苹果及微软操作系统均被攻破
查看>>
自由职业者和外包接单项目分析
查看>>
一起谈.NET技术,HTTP协议及POST与GET操作差异,C#中如何使用POST、GET等
查看>>
文明重启怎么做RUST堡垒_文明重启怎么地下建房-地下建房技巧
查看>>
用python画微信捂脸_用 Python 画一个捂脸表情
查看>>
mysql alter float_mysql-数据类型
查看>>
服务器被黑 追寻ip_服务器被如下ip攻击,如何根据ip超找攻击来源
查看>>
java 方差_java计算方差、标准差(均方差)实例代码
查看>>
<<java程序设计>>_Java程序设计
查看>>