离散第二周选做题
真值表转表达式
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
using namespace std;
int n,a[205];
vector<char> t,f;
int main(){
puts("How many variables?");
scanf("%d",&n);
puts("What are they?");
char s[15],c[105];
int tot=0;
for(int i=1;i<=n;i++){
scanf("%s",s+1);
c[tot++]=s[1];
}
sort(c,c+tot);
for(int i=0;i<tot;i++) printf("%c ",c[i]);
puts("RESULT\n");
for(int i=0;i<(1<<tot);i++){
for(int p=0;p<tot;p++){
if(i&(1<<(tot-p-1))) a[p]=1,printf("1 ");
else printf("0 "),a[p]=0;
}
int w;
scanf("%d",&w);
if(w){
if(t.size()) t.push_back('v');
t.push_back('(');
for(int p=0;p<tot;p++){
if(!a[p]) t.push_back('#');
t.push_back(c[p]);
if(p<tot-1) t.push_back('^');
}
t.push_back(')');
}else{
if(f.size()) f.push_back('^');
f.push_back('(');
for(int p=0;p<tot;p++){
if(a[p]) f.push_back('#');
f.push_back(c[p]);
if(p<tot-1) f.push_back('v');
}
f.push_back(')');
}
}
if(!t.size()) t.push_back('F');
if(!f.size()) f.push_back('T');
puts("# for negative");
printf("T: ");
for(int i=0;i<t.size();i++) printf("%c",t[i]);
puts("");
printf("F: ");
for(int i=0;i<f.size();i++) printf("%c",f[i]);
puts("");
return 0;
}
表达式求值
#include <iostream>
#include <cstdio>
#include <cstring>
#include <vector>
#include <algorithm>
#define mp make_pair
using namespace std;
char s[100005],c[1005];
int n,w[1005],id[1005];
char op[5]={'#','+','*','^','$'};
int solve(int L,int R){
vector<pair<char,int> > a;
for(int i=L;i<=R;i++){
if(s[i]>='A'&&s[i]<='Z') a.push_back(mp(w[s[i]],i));
else a.push_back(mp(s[i],i));
}
while(1){
bool t=1;
for(int i=0;i<a.size();i++){
if(a[i].first==')'){
for(int p=i;p>=0;p--){
if(a[p].first=='('){
int x=solve(a[p].second+1,a[i].second-1);
for(int k=p+1;k<=i;k++) a.erase(a.begin()+p);
a[p]=mp(x,a[p].second);
i=p;
t=0;
break;
}
}
}
}
if(t) break;
}
for(int k=0;k<5;k++){
for(int j=0;j<a.size();j++)if(a[j].first==op[k]){
if(k==0){
a[j+1].first^=1;
a.erase(a.begin()+j);
j--;
}else{
if(k==1) a[j-1].first&=a[j+1].first;
if(k==2) a[j-1].first|=a[j+1].first;
if(k==3) a[j-1].first=(!a[j-1].first)|a[j+1].first;
if(k==4) a[j-1].first=a[j-1].first==a[j+1].first;
a.erase(a.begin()+j);a.erase(a.begin()+j);
j--;
}
}
}
return a[0].first;
}
bool cmp(char a,char b){
return a>b;
}
int main(){
puts("All variables should be capital letters!");
puts("+ for and");
puts("* for or");
puts("# for negative");
puts("^ for right arrow");
puts("$ for leftright arrow");
scanf("%s",s+1);
n=strlen(s+1);
int x=0;
for(int i=1;i<=n;i++){
if(s[i]=='(') x++;
if(s[i]==')') x--;
if(x<0) return puts("Wrong Brackets!"),0;
}
if(x) return puts("Wrong Brackets!"),0;
int tot=0;
for(int i=1;i<=n;i++){
if(s[i]>='A'&&s[i]<='Z'){
if(!id[s[i]]) c[tot++]=s[i],id[s[i]]=1;
}
}
sort(c,c+tot,cmp);
for(int i=tot-1;i>=0;i--) printf("%c ",c[i]);
printf("ANS\n");
for(int i=0;i<(1<<tot);i++){
for(int p=tot-1;p>=0;p--){
if(i&(1<<p)) printf("1 "),w[c[p]]=1;
else printf("0 "),w[c[p]]=0;
}
printf("%d\n",solve(1,n));
}
return 0;
}