蓝桥杯篇3 - 24点

5 篇文章 0 订阅
1 篇文章 0 订阅

题目的 大概意思 如下

给出a, b, c, d四个数且1<=a, b, c, d<=10;
对这四个数使用加减乘除运算,判断这四个数的能否等于24;
能的话输出表达式(可能有多个表达式)
例如
输入
2 2 2 3
输出
2*2*2*3(或其他表达式)

思路

在下才疏学浅,德薄能鲜,仅供美芹之献。
看老师的 视频教程。从第十二分钟左右开始

代码

//
//  main.cpp
//  24点
//
//  Created by 罗璞 on 2017/5/28.
//  Copyright © 2017年 Rbtoooooooooo. All rights reserved.
//

#include <iostream>
#include "stack"
#include "math.h"
#include "string.h"
using namespace std;

void addRandomOper(int a[]) {
    for (int i=4; i<7; i++) {
        int r=random()%4;
        switch (r) {
            case 0: a[i]=11; break; // 表示+
            case 1: a[i]=12; break; // 表示-
            case 2: a[i]=13; break; // 表示*
            case 3: a[i]=14; break; // 表示/
        }
    }
}

void shuffleCards(int a[]) {
    for (int i=0; i<7; i++) {
        int r=random()%7;
        swap(a[i], a[r]);
    }
}

int operate(int a1, int a2, int oper) {
    switch (oper) {
        case 11: return a1+a2; break;
        case 12: return a1-a2; break;
        case 13: return a1*a2; break;
        case 14: if(a2!=0 && a1%a2==0) {
            return a1/a2;
        }
    }
    return -1000;
}

bool calculate(int a[]) {
    stack<int> stk;
    int result;
    if (a[0]>10 || a[1]>10 || a[6]<11) {
        return false;
    }
    for (int i=0; i<7; i++) {
        if (a[i]<11) {
            stk.push(a[i]);
        } else if (stk.size()<2) {
            return false;
        } else {
            int a1=stk.top();
            stk.pop();
            int a2=stk.top();
            stk.pop();
            result=operate(a1, a2, a[i]);
            if(result!=-1000) {
                stk.push(result);
            } else {
                return false;
            }
        }
    }
    return stk.top()==24;
}

string toOper(int a) {
    switch (a) {
        case 11: return "+"; break;
        case 12: return "-"; break;
        case 13: return "\*"; break;
        case 14: return "/"; break;
    }
    return "";
}

void show(int a[]) {
    string result;
    stack<string> stk;
    for (int i=0; i<7; i++) {
        if (a[i]<11) {
            stk.push(to_string(a[i]));
        } else {
            string a1=stk.top();
            stk.pop();
            string a2=stk.top();
            stk.pop();
            result="("+a1+toOper(a[i])+a2+")";
            stk.push(result);
        }
    }
    cout<<stk.top()<<endl;
}

int main(int argc, const char * argv[]) {
    int a[4], data[7]={0};
    for (int i=0; i<4; i++) {
        cin>>a[i];
    }
    for (int i=0; i<100000; i++) {
        for (int i=0; i<4; i++) {
            data[i]=a[i];
        }
        addRandomOper(data);
        shuffleCards(data);
        if (calculate(data)) {
            show(data);
        }
    }
    return 0;
}

运行结果


### 突然觉得自己好差劲啊 一点毅力都没有
### 诫子书 诸葛亮 (与诸君共勉之)

夫君子之行,静以修身,俭以养德。非澹泊无以名,非宁静无以致远。夫学须静也,才须学也,非学无以广才,非志无以成学。韬慢则不能励精,险躁则不能治性。年与时驰,意与日去,遂成枯落,多不接世,悲守穷庐,将复何及!

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值