速算游戏
fun.pas/c/cpp

源程序名 fun.pas|c|cpp
输入文件名 fun.in
输出文件名 fun.out
时间限制 1s/testcase
空间限制 32MB

问题描述
jyx和cyy打赌,比谁24点算得快,算得慢的那个人请客。24点的规则是这样的:给定4个1..9的整数,用括号改变运算顺序,通过加、减、乘、除通的一系列运算,得到整数24,注意所有中间结果必须是整数(例如(2*2)/4是允许的,而2*(2/4)是不允许的)。为了赢得这个比赛,请写一个程序帮助我作弊,快速地计算出24点。

输入数据
一行 4 个整数,为给定的 4 个数字。输入数据保证有解。

输出数据
一行,以字符串的形式输出结果,注意将每一步的运算的括号补齐(例如(3+5)+6和3*(5+6))如果有多种解答,输出字典顺序最小的一个。

样例输入
2 3 5 7

样例输出
(((3*5)+2)+7)

首先我们可以归纳出大体框架,即   A~B~C~D     (ABCD分别代表四个数,~代表符号,数不能重复,符号可以)

然后我们往里面添上括号,就可以得到五种情况
①(((A~B)~C)~D)
②((A~B)~(C~D))
③((A~(B~C))~D)
④(A~((B~C)~D))
⑤(A~(B~(C~D)))

上面五种情况是可以手算出来的,那么剩下需要我们做的就是把数和符号填入,自然而然就想到了深搜全排列!

先全排列数字,每排完一种数字的方案,就排符号的方案,全部完了后就可以得到数字和符号组合的所有方案(注意全排列数字需要hash标记,因为不能重复,但是符号是可以重复的,所以不需要hash标记)

现在就剩下计算的模块了(最恼火的),我们需要根据上面所编排的五种括号的位置,在每次全排列完成后进行一次判断,可行的话就入优先队列(小根堆,要按字典序排序)

一定要注意除法的特殊性,根据题目要求我们可以得到如果是x/y,那么就要满足  x>y>0 并且 x可以整除y,至于代码的实现我们可以写一个函数返回longint,即calc(x,op,y)   x和y为两个数,op为符号,不满足上面的条件就返回-1,在每次调用的时候判断是否为-1,是-1就表示当前方案不可行

最后找到可行方案了,就按照当前方案存成字符串string(很烦的),入优先队列(pascal可以写入数组,最后快排)

剩下的就是细节问题了,就不多说了

C++ Code

/*
C++ Code
http://oijzh.cnblogs.com
by jiangzh
*/
#include<cstdio>
#include<iostream>
#include<cctype>
#include<string>
#include<queue>
#include<algorithm>
#include<vector>
using namespace std;int a[5],num[5];//a是输入数据   num用来存每次全排列的方案
priority_queue<string,vector<string>,greater<string> > q;
bool h[5];
char op[5]={'*','+','-','/'},opp[5];//op是四种运算符   opp用来存每次全排列的方案int calc(int x,char op,int y)
{if(op=='+') return x+y;if(op=='-') return x-y;if(op=='*') return x*y;if(op=='/') if(x>y && y>0 && x%y==0)return x/y;else return -1;//不满足除法要求的就返回-1
}void check()//判断当前方案是否可行,可行则入队列
{int temp,temp2;string s;bool flag;//   (((A~B)~C)~D)flag=true;//标记是否不满足除法(返回-1),不满足就为false,   -----下同if((temp=calc(num[1],opp[1],num[2]))==-1)flag=false;if((temp=calc(temp,opp[2],num[3]))==-1)flag=false;if((temp=calc(temp,opp[3],num[4]))==-1)flag=false;if(flag && temp==24){s="(((";s+=(num[1]+'0');s+=opp[1];s+=(num[2]+'0');s+=")";s+=opp[2];s+=(num[3]+'0');s+=")";s+=opp[3];s+=(num[4]+'0');s+=")";q.push(s);}//   ((A~B)~(C~D))flag=true;if((temp=calc(num[1],opp[1],num[2]))==-1)flag=false;if((temp2=calc(num[3],opp[3],num[4]))==-1)flag=false;if((temp=calc(temp,opp[2],temp2))==-1)flag=false;if(flag && temp==24){s="((";s+=(num[1]+'0');s+=opp[1];s+=(num[2]+'0');s+=")";s+=opp[2];s+="(";s+=(num[3]+'0');s+=opp[3];s+=(num[4]+'0');s+="))";q.push(s);}//   (A~((B~C)~D))flag=true;if((temp=calc(num[2],opp[2],num[3]))==-1)flag=false;if((temp=calc(temp,opp[3],num[4]))==-1)flag=false;if((temp=calc(num[1],opp[1],temp))==-1)flag=false;if(flag && temp==24){s="(";s+=(num[1]+'0');s+=opp[1];s+="((";s+=(num[2]+'0');s+=opp[2];s+=(num[3]+'0');s+=")";s+=opp[3];s+=(num[4]+'0');s+="))";q.push(s);}//   ((A~(B~C))~D)flag=true;if((temp=calc(num[2],opp[2],num[3]))==-1)flag=false;if((temp=calc(num[1],opp[1],temp))==-1)flag=false;if((temp=calc(temp,opp[3],num[4]))==-1)flag=false;if(flag && temp==24){s="((";s+=(num[1]+'0');s+=opp[1];s+="(";s+=(num[2]+'0');s+=opp[2];s+=(num[3]+'0');s+="))";s+=opp[3];s+=(num[4]+'0');s+=")";q.push(s);}//   (A~(B~(C~D)))flag=true;if((temp=calc(num[3],opp[3],num[4]))==-1)flag=false;if((temp=calc(num[2],opp[2],temp))==-1)flag=false;if((temp=calc(num[1],opp[1],temp))==-1)flag=false;if(flag && temp==24){s="(";s+=(num[1]+'0');s+=opp[1];s+="(";s+=(num[2]+'0');s+=opp[2];s+="(";s+=(num[3]+'0');s+=opp[3];s+=(num[4]+'0');s+=")))";q.push(s);}}void dfsop(int x)
{if(x>3){//for(int i=1;i<=3;i++) printf("%c ",opp[i]);//printf("\n");check();return;}for(int i=0;i<4;i++){opp[x]=op[i];dfsop(x+1);}
}void dfs(int x)
{if(x>4){//for(int i=1;i<=4;i++) printf("%d ",num[i]);//printf("\n");dfsop(1);//生成符号的全排列return;}for(int i=1;i<=4;i++)if(!h[i]){num[x]=a[i];h[i]=true;dfs(x+1);h[i]=false;}
}int main()
{freopen("fun.in","r",stdin);freopen("fun.out","w",stdout);for(int i=1;i<=4;i++) scanf("%d",&a[i]);dfs(1);//生成数字的全排列if(!q.empty())//用优先队列储存,直接输出队头字典序小的{cout<<q.top();exit(0);}return 0;
}

  

转载于:https://www.cnblogs.com/oijzh/archive/2012/10/25/2739179.html

【暴力枚举】速算游戏 fun.pas/c/cpp相关推荐

  1. luogu P1834 速算游戏 题解

    2022-01-13 20:52:15 thumb_up 0 模拟大题 模拟赛没人的碰题,不简单 前言:为了表达,一下将类似于"(((3+5)+2)+7)"的东西称作"形 ...

  2. 速算24点java_24点速算游戏 Java 代码

    import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.H ...

  3. 改进后的速算小游戏(2011211909 苟玲、2011211933 郝怡然)

    1.开发环境: Visual  C++  6.0  使用C语言编写 2.功能说明: 该游戏是几个小游戏的结合体,主要是针对小学生的速算练习.其改进之处在于在普通的速算程序的基础上添加了几个小游戏,在进 ...

  4. Python写个小游戏:速算24点(上)

    文章目录 前言 速算24点 1. 玩法简介 2. 游戏流程 3. 搭建游戏界面 1). 基本界面 2). 洗牌.发牌 洗牌 发牌 3). 计时器 4). 玩家输入公式(答案) StringVar类 按 ...

  5. Python写个小游戏:速算24点(下)

    文章目录 前言 速算24点 1. 玩法简介 2. 游戏流程 3. 剩下的部分 1). 关卡 / 分数信息 IntVar类 2). 提示按钮 图片 按钮 3). 重新发牌 4. 让电脑计算24点 1). ...

  6. 计算机二十四点游戏,比比速算24点游戏

    电脑扑克牌游戏试运行在PC端的智力小游戏,这次带来的是比比速算24点游戏,学习纸牌的同时还能不断提高你的头脑思维能力,让你的智商一天比一天更高.比比速算24点游戏设置了一级高手.二级能手.三级好手.四 ...

  7. 暴力枚举法解决“炸弹人”游戏

    题目:最近小付迷恋上一款"炸弹人"游戏,在过关关卡中,他要在空地放置炸弹,使得被消灭的人最多,现在,小付请你帮他写一个程序,看看放于何处消灭的敌人最多.(炸弹可以消灭同一列的敌人和 ...

  8. 火柴棒游戏(暴力枚举)C++

    暴力枚举 P1149 [NOIP2008 提高组] 火柴棒等式 题目描述: 给你n根火柴棍,你可以拼出多少个形如"A+B=CA+B=C"的等式?等式中的AA.BB.CC是用火柴棍拼 ...

  9. HDU 1427 速算24点 (深搜)

    题目链接 Problem Description 速算24点相信绝大多数人都玩过.就是随机给你四张牌,包括A(1),2,3,4,5,6,7,8,9,10,J(11),Q(12),K(13).要求只用' ...

最新文章

  1. Datawhale第九期组队学习计划
  2. 一、进程的概念、组成和特征
  3. NLTK与NLP原理及基础
  4. 句法分析:依存分析(Dependency Parsing)
  5. Python之深入解析如何制作国际空间站实时跟踪器
  6. QT学习笔记(1)----- QT简介
  7. C++之inline函数
  8. java 高级网络编程_java高级网络编程—客户端与服务器
  9. CentOS7 安装git服务器
  10. 阶段1 语言基础+高级_1-3-Java语言高级_07-网络编程_第3节 综合案例_文件上传_2_综合案例_文件上传案例的客户端...
  11. 用友/U8+V16.0修改单据时,其他入库单其他出库单无保质期信息且置灰无法输入/修改
  12. GridView样式用代码来设置
  13. 什么软件可以编辑PDF,PDF怎么拆分页面
  14. 咱用AppDesigner开发复现了一款我国古老的桌游 —【升官图】
  15. 打造智慧城市 构建新型城镇化
  16. PyTorch深度学习——PyCharm中使用matplotlib画3D曲面图
  17. 给在读研究生+未来要读研同学们的一封受益匪浅的信
  18. 【海大838】22年考研真题及解析
  19. 百度短网址 php,调用百度短网址API生成短网址
  20. 【C#】关闭 Window 之后,无法设置 Visibility,也无法调用 Show、ShowDialogor 或 WindowInteropHelper.EnsureHandle

热门文章

  1. 信息安全概论(第3版)课后习题答案 牛少彰 崔宝江 李剑编著
  2. 一款使用MarkDown描述的自动化神器Gauge
  3. NOKIA手机共有的缺陷
  4. 天地图墨卡托在线地址
  5. linux图形界面压缩软件,p7zip 压缩软件 for Linux
  6. ZooKeeper只完美解决Unable to read additional data from server sessionid 0x0报错问题,并带你深度理解ZooKeeper内部机制之选举机制
  7. 有一楼梯共m级,刚开始时你在第一级,若每次只能跨上一级或二级,要走上第m级,共有多少走法? 注:规定从一级到一级有0种走法。
  8. java 使用 freemarker模板 生成 word 并用 aspose 转换成PDF
  9. 36Kr常锋无人机-项目分析和投资决策要点
  10. 2021.06.03邮票面值设计