前面三个输出代表p,q,r的值,第四个表示输出结果
总共有2的n次方种输入
#include<stdio.h>
#include<vector>
#include<string>
#include<iostream>
#include<stack>
using namespace std;
vector<int> d;
vector<vector<int> > change; //变元
void dfs(int n) {
int i;
if (d.size() == n) {
change.push_back(d);
} else {
for (i = 0; i < 2; i++) {
d.push_back(i);
dfs(n);
d.pop_back();
}
}
}
vector<vector<int> > change_yuan(int n) {
d.clear();
change.clear();
dfs(n);
return change;
}
int caculate(int op1, int op2, char op) {
if (op == 'a') {
return op1*op2;
}
if (op == 'o') {
if (op1 == 0 && op2 == 0)
return 0;
return 1;
}
if (op == 'i') {
return caculate(1-op1, op2, 'o');
}
if (op == 'e') {
if (op1 == op2)
return 1;
return 0;
}
}
int main() {
int i, j, n;
string input;
cin>>n>>input;
change_yuan(n);
for (i = 0; i < change.size(); i++) {
stack<int> op_shu;
for (j = 0; j < input.length(); j++) {
if (input[j] == 'a' || input[j] == 'o' || input[j] == 'i' || input[j] == 'e') {
int op2 = op_shu.top();
op_shu.pop();
int op1 = op_shu.top();
op_shu.pop();
op_shu.push(caculate(op1, op2, input[j]));
// 非操作是单元运算
} else if (input[j] == 'n') {
int x = op_shu.top(); op_shu.pop();
op_shu.push(1-x);
}
else
op_shu.push(change[i][input[j]-'0']);
}
for(j=0;j<change[i].size();j++) printf("%d ", change[i][j]);
printf("%d\n", op_shu.top());
}
}