24点问题(穷举法/C++)
2015-07-30 15:04
429 查看
算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]++;
}
}
算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]++;
}
}
相关文章推荐
- [c++]C++文件读写详解(ofstream,ifstream,fstream)
- 产生数问题(map+queue/C++)
- [LeetCode] Remove Duplicates from Sorted Array II
- BOOL和bool区别
- 学c语言难吗?
- C++ 图片类型(所有类型)最简单的复制黏贴实现
- C++ fstream文件流读写文件操作
- C语言——缓冲区
- C++矩阵运算库--Eigen
- 【语言-c++】RSA加密算法 (C++)
- [LeetCode] Word Search
- C++反汇编揭秘1 – 一个简单C++程序反汇编解析 (Rev. 3)
- (面试题)请用C语言实现在32位环境下,两个无符号长整数相加的函数,相加之和不能存储在64位变量中
- 关于操作符和函数的区别
- C语言指针
- C++访问MySQL数据
- 用eclipse写C++的常用设置
- 黑马程序员--iOS基础--C语言知识点---选择语句
- 探讨数组与字符串输入的问题(C++版)
- C++获取系统时间的方法