题目
1□2□3□4□5□6□7□8□9=110
要求在中间的8个空中填写+,-,或不填。构成的表达式判断是不是正确,正确则输出。。。。
(如果空格的中没有填写符号,则这几个数组成一个新的N位数,比如1□2,可以是1+2,也可以是12)
Code
#include<bits/stdc++.h>
using namespace std;
int n; //层次
int result = 0; //存储结果
int symbol[9] = {-1}; //记录符号(第一个不用,从 symbol[1]开始
int a[10] = {1,2,3,4,5,6,7,8,9};//运算数 (第一个不用,从a[1]开始
stack<int> data; //存储数据
stack<int> oper; //存储操作符
int calc(int n){
if(n==9){
while(!oper.empty()){
int b = data.top();
data.pop();
int c = data.top();
data.pop();
int op = oper.top();
oper.pop();
if(op==1){
data.push(c-b);
}
if(op==0){
data.push(c+b);
}
}
//最后结果,并输出
int result = data.top();
if(result==110){
cout<<'1';
for(int i = 1;i<=8;++i){
if(symbol[i]==0) cout<<"+";
else if(symbol[i]==1) cout<<"-";
cout<<a[i];
}
cout<<"=110"<<endl;
}
return 0;
}
//三种选择
for(int i = 0;i<3;++i){
stack<int> oper_tmp = oper;
stack<int> data_tmp = data;
if(i==0){
symbol[n] = 0;
oper.push(symbol[n]);
data.push(a[n]);
}else if(i==1){
symbol[n] = 1;
oper.push(symbol[n]);
data.push(a[n]);
}else{
symbol[n] = 2;
int temp = data.top();
data.pop();
temp = temp*10 + a[n];
data.push(temp);
}
calc(n+1);
oper = oper_tmp;//还原
data = data_tmp;
}
}
int main(){
data.push(1);
calc(1);
return 0;
}