24点问题(穷举法/C++)
来源:互联网 发布:信用卡能买淘宝吗 编辑:程序博客网 时间:2024/05/02 02:26
算24点(point24)
【问题描述】
几十年前全世界就流行一种数字游戏,至今仍有人乐此不疲.在中国我们把这种游戏称为“算24点”。您作为游戏者将得到4个1~9之间的自然数作为操作数,而您的任务是对这4个操作数进行适当的算术运算,要求运算结果等于24。
您可以使用的运算只有:+,-,*,/,您还可以使用()来改变运算顺序。注意:所有的中间结果须是整数,所以一些除法运算是不允许的(例如,(2*2)/4是合法的,2*(2/4)是不合法的)。下面我们给出一个游戏的具体例子:
若给出的4个操作数是:1、2、3、7,则一种可能的解答是1+2+3*7=24。
【输入】
只有一行,四个1到9之间的自然数。
【输出】
如果有解的话,只要输出一个解,输出的是三行数据,分别表示运算的步骤。其中第一行是输入的两个数和一个运算符和运算后的结果,第二行是第一行的结果和一个输入的数据、运算符、运算后的结果;第三行是第二行的结果和输入的一个数、运算符和“=24”。如果两个操作数有大小的话则先输出大的。
如果没有解则输出“No answer!”
【样例】
point24.in
1 2 3 7
point24.out
2+1=3
7*3=21
21+3=24
总可能情况很少,只有4个数字和4种符号(括号),直接采用穷举法,但要稍微处理下叠加括号问题。
但是这里发现只有括号内有加减法运算,括号外有乘除法运算时,该括号才有意义,因此分析后发现只有4个数字时,叠加括号是没有意义的(这里说的不太清楚,自己稍微推一下就知道了)。代码如下
#include <iostream>#include <cstdio>#include <cstring>#include <string>using namespace std;int a1[5],b1[4];void gol(char f,int k,int num){if (f=='a') for(int i=k;i<=num;i++) a1[i-1]=a1[i];if (f=='b') for(int i=k;i<=num;i++) b1[i-1]=b1[i];}int cal(int a,int b,int num){if (num==0) return a+b;if (num==1) return a-b;if (num==2) return a*b;if (num==3) return a/b;}string cha(int a){string p;p="";while(a>0){p=(char)(a%10)+p;a/=10;}return p;}string chaf(int a){if (a==0) return "+";if (a==1) return "-";if (a==2) return "*";if (a==3) return "/";}int main(){string ans[5];int a[5],b[5],i,anum,bnum;for(i=1;i<=4;i++) cin >> a[i];memset(b,0,sizeof(b));bool f[4];int s,j,d[4],ansnum;while(b[0]==0){/*for(i=1;i<=3;i++){cout << b[i] << " ";}*///cout << endl;memset(f,0,sizeof(f));s=0;for(i=1;i<=3;i++){if (b[i]==1 || b[i]==0){if (b[i-1]==3 || b[i-1]==2 || b[i+1]==3 || b[i+1]==2){s++;d[s]=i;}}}while(f[0]==0){for(i=1;i<=s;i++){cout << f[i] << " ";}cout << endl;for(i=1;i<=4;i++) a1[i]=a[i];for(i=1;i<=3;i++) b1[i]=b[i];anum=4;bnum=3;for(i=1;i<=4;i++) ans[i]="";ansnum=0;j=1;while(j<=bnum){if (f[j]==1){ansnum++;ans[ansnum]=cha(a1[d[j]])+chaf(b1[d[j]])+chaf(a1[d[j]+1])+"=";a1[d[j]]=cal(a1[d[j]],a1[d[j]+1],b1[d[j]]);ans[ansnum]+=cha(a1[d[j]]);gol('a',d[j]+1,anum);anum--;gol('b',d[j]+1,bnum);bnum--;}j++;}j=1;//cout << anum << " " << bnum << endl;while(j<=bnum){if (b[j]==2 || b[j]==3){ansnum++;ans[ansnum]=cha(a1[j])+chaf(b1[j])+chaf(a1[j+1])+"=";a1[j]=cal(a1[j],a1[j+1],b1[j]);ans[ansnum]+=cha(a1[j]);gol('a',j+1,anum);anum--;gol('b',j+1,bnum);bnum--;}j++;}//cout << anum << " " << bnum << endl;j=1;while(j<=bnum){ansnum++;ans[ansnum]=cha(a1[j])+chaf(b1[j])+chaf(a1[j+1])+"=";a1[j]=cal(a1[j],a1[j+1],b1[j]);ans[ansnum]+=cha(a1[j]);gol('a',j+1,anum);anum--;gol('b',j+1,bnum);bnum--;}//cout << anum << " " << bnum << endl;//cout << a1[1] << endl;if (a1[1]==24){for(j=1;j<=ansnum;j++){cout << ans[j] << endl;}return 0;}j=s;while(f[j]==1){f[j]==0;j--;}f[j]=1;}//cout << "---------------\n";i=3;while(b[i]==3){b[i]=0;i--;}b[i]++;}}
0 0
- 24点问题(穷举法/C++)
- 24点|穷举法【待续】
- 第八周—C语言 穷举法(鸡兔共笼问题)
- 第八周—C语言 穷举法(换分币问题)
- 实现24点游戏-穷举法
- C_穷举法:求24点
- 【JAVA】24点 递归穷举
- 24点游戏-穷举破解
- C++/7.27穷举法
- C语言穷举法
- 穷举法解决组合问题(换分币)
- 穷举法--百钱百鸡问题
- 算24 (穷举法)
- 基于穷举法的24点游戏算法(tcl版本)
- 用穷举法列出24点的解
- MATLAB求解24点(抱歉,只会穷举)
- 我的c学习:穷举法 百鸡百钱问题
- 正方形计数问题(穷举+pair+struct/C++)
- 小明系列问题——小明序列 - HDU 4521 DP
- iOS开发UI篇—UIScrollView控件实现图片缩放功能
- 杭电1213 How Many Tables(并查集找根节点)
- SQL之CONVERT(varchar(100), GETDATE(), 0)
- robotframework ride 版本兼容问题
- 24点问题(穷举法/C++)
- [Leetcode] Isomorphic Strings
- MySQL主从复制下BINLOG内容分析
- 【初识 EasyTouch】 (二)单指手势识别
- <input>禁止键盘及中文输入
- YARN工作原理简述
- ListActivity实现列表学习笔记
- iOS 与 Android 生命周期对比
- 公众号的秘密,知道一个biz就够了