算24点 C++

其实这道题木有什么困难,先放题目吧!
【 问题描述】
几十年前全世界就流行一种数字游戏, 至今仍有人乐此不疲. 在中国我们把
这种游戏称为“ 算 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)代码发送!

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值