题目的 大概意思 如下
给出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;
}
运行结果
### 突然觉得自己好差劲啊 一点毅力都没有
### 诫子书 诸葛亮 (与诸君共勉之)
夫君子之行,静以修身,俭以养德。非澹泊无以名,非宁静无以致远。夫学须静也,才须学也,非学无以广才,非志无以成学。韬慢则不能励精,险躁则不能治性。年与时驰,意与日去,遂成枯落,多不接世,悲守穷庐,将复何及!