您的位置:首页 > 其它

[华为oj]24点问题

2015-09-06 16:18 459 查看
这里提供自己解二十四点的思路。总的思路就是用类似递归思想:

(1)在4个数中选两个数进行运算,与另外两个数放在一起,执行步骤(2);

   判断步骤(2)返回结果,为1,返回结果1;为0,继续下一个运算,直至结束,返回结果0;

(2)在3个数中选两个数进行运算,与另一个数放在一起,执行步骤(3);

  判断步骤(3)返回结果,为1,返回结果1;为0,继续下一个运算,直至结束,返回结果0;

(3)对两个数进行运算,判断是否为24。是,返回1;否,返回0。

这个思想就是穷举方法,列出所有可能的情况,有个好处就是不需要考虑括号的情况。代码比较多,但应该比较好理解一点。两个细节:

1)在两个数进行运算的时候,需要把先后顺序也考虑进去。

2)当除数为0时,显然不满足情况,因此,返回一个比较大的值。

具体代码如下:

#include <iostream>

using namespace std;

char op[4]={'+','-','*','/'};

float CalNum(float a,float b,char op)
{
if(b==0)
return 10000;

float t=0;
switch(op)
{
case '+':
t=a+b;
break;
case '-':
t=a-b;
break;
case '*':
t=a*b;
break;
case '/':
t=a/b;
break;
}
return t;
}

float Cal2Num(float a[])
{
float result=0;
for(int i=0;i<2;i++)
{
for(int p=0;p<4;p++)
{
result=CalNum(a[i],a[1-i],op[p]);
if(result==24)
{
return 1;
}
}
}
return 0;
}

float Cal3Num(float a[])
{
float a2[2];
for(int i3=0;i3<3;i3++)
{
for(int j3=i3+1;j3<3;j3++)
{
for(int k=0;k<3;k++)
{
if(k!=i3&&k!=j3)
a2[1]=a[k];
}

for(int p=0;p<4;p++)
{
for(int d=0;d<2;d++)
{
if(d==0)
a2[0]=CalNum(a[i3],a[j3],op[p]);
else
a2[0]=CalNum(a[j3],a[i3],op[p]);
if(Cal2Num(a2))
return 1;
}
}
}
}
return 0;
}

float Cal4Num(float a[])
{
float a3[3];
for(int i=0;i<4;i++)
{
for(int j=i+1;j<4;j++)
{
int t=1;
for(int m=0;m<4;m++)
{
if(m!=i&&m!=j)
a3[t++]=a[m];
}

for(int p=0;p<4;p++)
{
for(int d=0;d<2;d++)
{
if(d==0)
a3[0]=CalNum(a[i],a[j],op[p]);
else
a3[0]=CalNum(a[j],a[i],op[p]);
if(Cal3Num(a3))
return 1;
}
}
}
}
return 0;
}

int main()
{
float a4[4];
cin>>a4[0]>>a4[1]>>a4[2]>>a4[3];
if(Cal4Num(a4))
cout<<"true"<<endl;
else
cout<<"false"<<endl;
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: