
【DFS】【DP】【DG特长生2017】T2益智游戏
发布日期:2021-05-07 22:47:27
浏览次数:25
分类:精选文章
本文共 2428 字,大约阅读时间需要 8 分钟。
题目大意
24点游戏。
给你n组数据,要你得出这四个数是否能完成24点。 需要注意的是可以使用括号且数字顺序可调换,运算过程中只能出现整数。 (然而原题面上没说数字顺序可调换…导致一堆人比赛时70分…)解
原题:顺序可调换
由于顺序可以打乱,直接暴力dfs看看能不能合成24。
顺序不可调换
啊啊,挺头裂的。
悄悄跑去问大爷这题怎写。TJH:我不清楚对不对啊 就暴搜啊
我:这题气得我想用桶… TJH:这?我用了个vector好。vector,我不会。再见。
于是写了个DP。分区间处理结果…再合并。然后一个区间可能有多种结果…又再枚举出来、运算。
然后,就五重了… 整挺烦的。代码
原题:顺序可调换
#include#include #include using namespace std;int flag,b[11],a[11],t;void dfs(int now, int z){ if(now == 4){ if(z == 24) flag = 1; return; } for(int i = 1; i <= 4; ++i) if(b[i] == 0){ b[i] = 1; dfs(now+1, z+a[i]); //加减乘除 dfs(now+1, z-a[i]); dfs(now+1, z*a[i]); if(a[i] != 0) if(z % a[i] == 0) dfs(now+1, z/a[i]); //除法特别判断 b[i] = 0; }}void work(){ scanf("%d%d%d%d",&a[1], &a[2], &a[3], &a[4]); memset(b, 0, sizeof(b)); flag = 0; for(int i = 1; i <= 4; ++i){ //枚举第一个数 b[i] = 1; dfs(1, a[i]); //正或负 dfs(1, -a[i]); if(flag == 1) break; b[i] = 0; } if(flag == 1) printf("1\n"); else printf("0\n");}int main(){ freopen("game.in","r",stdin); freopen("game.out","w",stdout); scanf("%d", &t); //多组数据 while(t--) work(); fclose(stdin); fclose(stdout);}
顺序不可调换
(注释都不想打了…艹
#include#include #include using namespace std;int flag, s[10][10][10000], a[10], l[10][10], t;void work(){ scanf("%d%d%d%d", &a[1], &a[2], &a[3], &a[4]); memset(s, 0, sizeof(s)); memset(l, 0, sizeof(l)); l[1][1] = 1; l[2][2] = 1; l[3][3] = 1; l[4][4] = 1; s[1][1][1] = a[1]; s[2][2][1] = a[2]; s[3][3][1] = a[3]; s[4][4][1] = a[4]; for(int len = 2; len <= 4; ++len) // 长度 for(int q = 1; q <= 5-len; ++q) // 起始 for(int d = q; d < q+len-1; ++d){ //断点:从q到d,从d+1到q+len-1 for(int jg1 = 1; jg1 <= l[q][d]; ++jg1) //前个区间的可能的结果 for(int jg2 = 1; jg2 <= l[d+1][q+len-1]; ++jg2){ //后个区间的可能的结果 s[q][q+len-1][++l[q][q+len-1]] = s[q][d][jg1] + s[d+1][q+len-1][jg2]; s[q][q+len-1][++l[q][q+len-1]] = s[q][d][jg1] - s[d+1][q+len-1][jg2]; s[q][q+len-1][++l[q][q+len-1]] = s[q][d][jg1] * s[d+1][q+len-1][jg2]; if(s[d+1][q+len-1][jg2] != 0) if(s[q][d][jg1] % s[d+1][q+len-1][jg2] == 0) s[q][q+len-1][++l[q][q+len-1]] = s[q][d][jg1] / s[d+1][q+len-1][jg2]; } } for(int i = 1; i <= l[1][4]; ++i) if(s[1][4][i] == 24) { printf("1\n"); return; } printf("0\n");}int main(){ freopen("game.in","r",stdin); freopen("game.out","w",stdout); scanf("%d", &t); while(t--) work(); fclose(stdin); fclose(stdout);}
发表评论
最新留言
初次前来,多多关照!
[***.217.46.12]2025年03月26日 04时29分27秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
Vue 数组和对象更新,但视图未更新,背后的故事
2021-05-09
剑指Offer面试题:9.二进制中1的个数
2021-05-09
《你是在做牛做马还是在做主管》- 读书笔记
2021-05-09
ASP.NET Core on K8S学习之旅(12)Ingress
2021-05-09
重新温习软件设计之路(4)
2021-05-09
《刷新》:拥抱同理心,建立成长型思维
2021-05-09
MVC3+NHibernate项目实战(二) :数据库访问层
2021-05-09
Flask入门
2021-05-09
MySQL数据库与python交互
2021-05-09
python如何对字符串进行html转义与反转义?
2021-05-09
开发小白也毫无压力的hexo静态博客建站全攻略 - 躺坑后亲诉心路历程
2021-05-09
java例题_24 逆向输入数字
2021-05-09
不管人生怎么走,都需要实时回头看看
2021-05-09
golang基础--类型与变量
2021-05-09
.NetCore外国一些高质量博客分享
2021-05-09
解决WebRTC中不同的浏览器之间适配的问题
2021-05-09