其实这道题木有什么困难,先放题目吧!
【 问题描述】
几十年前全世界就流行一种数字游戏, 至今仍有人乐此不疲. 在中国我们把
这种游戏称为“ 算 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, 输出“ YES”; 否则, 输出“ NO”。
【 样例】
Point24. In
5 5 5 1
Point24. Out
YES
稍微思考一下,发现这道题目并没有说明位置能不能变化,所以,我们可以把这四个数的排列算出来!!
1.将四个数视为一个集合;
2.从集合中随机取两个数,通过加减乘除计算这两个数的结果,然后再将结果放回集合,这样集合就减少了一个元素;
3.重复2的步骤,直到集合中只剩下一个元素为止;
4.查看最后一个元素是否有是24来得出结果。
下面到了发送代码的时候!!!(对不起,没有注解)
#include<stdio.h>
#include<stdlib.h>
int a[5],l;
void sou(int sum)
{
int m,n;
if(l==1)
return;
if(sum==1 && a[1]==24)
{
printf("YES");
l=1;
exit(0);
}
for(int i=1; i<sum; i++)
for(int j=i+1; j<=sum; j++)
for(int k=1; k<=6; k++)
{
m=a[i];
n=a[j];
switch(k)
{
case 1:
a[i]+=a[j];
a[j]=a[sum];
sou(sum-1);
break;
case 2:
a[i]-=a[j];
a[j]=a[sum];
sou(sum-1);
break;
case 3:
a[i]*=a[j];
a[j]=a[sum];
sou(sum-1);
break;
case 4:
if(a[j] && a[i]%a[j]==0)
{
a[i]/=a[j];
a[j]=a[sum];
sou(sum-1);
}
break;
case 5:
a[j]-=a[i];
a[i]=a[sum];
sou(sum-1);
break;
case 6:
if(a[i] && a[j]%a[i]==0)
{
a[j]/=a[i];
a[i]=a[sum];
sou(sum-1);
}
break;
}
a[i]=m;
a[j]=n;
}
}
int main()
{
freopen("point24.in","r",stdin);
freopen("point24.out","w",stdout);
scanf("%d%d%d%d",&a[1],&a[2],&a[3],&a[4]);
sou(4);
printf("NO");
return 0;
}
好了,今天下午还会将小木棍(stick)代码发送!