问题描述
试题编号: | 201903-2 |
试题名称: | 二十四点 |
时间限制: | 1.0s |
内存限制: | 512.0MB |
问题描述: |
|
代码: 优先级
1.参考https://blog.csdn.net/tigerisland45/article/details/99167285,直接先计算乘除,再计算加减。
主要要考虑的是计算之后怎么处理:数组做移动、替换。
#include<bits/stdc++.h>
using namespace std;
void judge(string s){
int a[4],i,j;
char op[3];
//从输入中取出数和运算符
for(i=0;i<4;i++) a[i]=s[i*2]-'0';
for(i=0;i<3;i++) op[i]=s[i*2+1];
int k=3;//总共计算3次
//x和/
for(i=0;i<k;i++){
if(op[i]=='x'||op[i]=='/'){
if(op[i]=='x') a[i]=a[i]*a[i+1];
else a[i]=a[i]/a[i+1];
for(j=i+1;j<k;j++){//前移
op[j-1]=op[j];
a[j]=a[j+1];
}
k--;i--;
}
}
int ans=a[0];
//+-直接做
for(i=0;i<k;i++){
if(op[i]=='+'){
ans=a[i]+a[i+1];
a[i+1]=ans;
}else{
ans=a[i]-a[i+1];
a[i+1]=ans;
}
}
if(ans==24) cout<<"Yes\n";
else cout<<"No\n";
}
int main(){
int n;
string s;
cin>>n;
while(n--){
cin>>s;
judge(s);
}
return 0;
}
创建一个栈q,遍历表达式的字符串,如果是1到9的数字则入栈;如果遇到乘法和除法符号,则弹出栈顶元素跟符号后的数字运算,运算结果存入栈中;如果遇到减号,则将符号后的数字变为它的负数,再入栈。最后,依次弹出栈顶元素进行相加。和为24,输出Yes,否则,输出No。
#include<bits/stdc++.h>
using namespace std;
int main(){
int n;
stack<int> q;
cin>>n;
string s;
while(n--){
cin>>s;
for(int i=0;i<7;i++){
if(s[i]<='9'&&s[i]>='0') q.push(s[i]-'0');
else if(s[i]=='x'||s[i]=='/'){
int x,y;
y=q.top();
if(s[i]=='x') x=y*(s[i+1]-'0');
else x=y/(s[i+1]-'0');
q.pop();
q.push(x);
i++;
}else if(s[i]=='-'){
q.push(-(s[i+1]-'0'));
i++;
}
}
int sum=0;
while(!q.empty()){
sum+=q.top();
q.pop();
}
if(sum==24) cout<<"Yes\n";
else cout<<"No\n";
}
return 0;
}