快算24(24点)

文章详细描述了一个C++程序,用于解决四数24点问题,通过遍历运算符组合寻找满足条件的解决方案。
摘要由CSDN通过智能技术生成

题目描述

快算24点游戏规则是这样的,作为游戏者将得到4个1~9之间的自然数作为操作数,而你的任务是对这4个操作数进行 +,-,*,/ 的4种运算,要求运算结果等于24。

你可以用( )来改变运算顺序。注意,所有的中间结果必须是整数,所以一些除法运算是不允许的(例如(2*2)/4是合法的,2*(2/4)是不合法的)。

下面给出一个游戏的具体例子:

若给出的4个操作数是1、2、3、7,则一种可能的解答是 1+2+3*7=24。

输入:输入4个1~9之间的自然数。

输出:如果有解的话,只需输出一个解,输出的是三行数据,分别表示运算的步骤,如果两个操作数有大小的话则先输出大的,如果没有解则输出“No”。

AC代码:

#include <iostream>
#include <cmath>
#include <algorithm>
using namespace std;

int a[5];
char opt[5] = {' ','+','-','*','/'};

int i,j,k;

int ff(int x,int ch,int y){
    if(ch == 1) return x + y;
    if(ch == 2) return max(x,y) - min(x,y);
    if(ch == 3) return x * y;
    if(ch == 4) return (y == 0 || x < y || x % y != 0) ? -999999 : x / y;
}

void pf(int a,int b,int c,int d,int e,int f)
{
    cout << max(a,b) << opt[i] << min(a,b) << "="  << ff(max(a,b),i,min(a,b)) << endl;
    cout << max(c,d) << opt[j] << min(c,d) << "="  << ff(max(c,d),j,min(c,d)) << endl;
    cout << max(e,f) << opt[k] << min(e,f) << "="  << ff(max(e,f),k,min(e,f)) << endl;
    exit(0);
}

int main()
{
    cin >> a[1] >> a[2] >> a[3] >> a[4];
    sort(a + 1,a + 5);
    do{
            for( i = 1;i <= 4;i ++){  // 枚举 符号
                for( j = 1;j <= 4;j ++)
                {
                    for( k = 1;k <= 4;k ++){
                        // ((a ? b) ? c) ? d
                        if(ff(ff(ff(a[1],i,a[2]),j,a[3]),k,a[4]) == 24)
                            pf(a[1],a[2],ff(a[1],i,a[2]),a[3],ff(ff(a[1],i,a[2]),j,a[3]),a[4]);
                            // (a?b)?(c?d)
                        else if(ff(ff(a[1],i,a[2]),k,ff(a[3],j,a[4])) == 24)
                            pf(a[1],a[2],a[3],a[4],ff(a[1],i,a[2]),ff(a[3],j,a[4]));
                    }
                }
            }
    }while(next_permutation(a + 1,a + 5));
    return 0;
}

运行结果

完结撒花✿✿ヽ(°▽°)ノ

都看到这里了,确定不给一个赞吗?

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值