掲示板システム
ホーム
アクセス解析
カテゴリ
ログアウト
3値理論を計算する練習問題が解けずに困っています (ID:72465)
名前
ホームページ(ブログ、Twitterなど)のURL (省略可)
本文
http://rose.u-aizu.ac.jp/onlinejudge/ProblemSet/description.jsp?id=1155&lang=jp リンク先問題が解けずに困っております。 コードはmystackに計算中の式を代入して問題を解いています。 myprint関数にmystackを渡すことで、計算中の式を見ることができます。 コードに何か問題があるらしくテストデータで不正解をくらってしまいます。 自分で何度もチェックしたのですがわかりませんでした。 どなたかアドバイスをお願いします。 #include <stdio.h> #include <stack> #include <map> #include <string.h> void myprint(std::stack<char> my); void solve(int n,char data[81]); char myNot(char c); int myVer(char c); char myAnd(char c1,char c2); char myOr(char c1,char c2); std::stack<char> mystack; std::map<char,int> rank; int r,q,p; int main() { char data[81]; int n; scanf("%s",data); n=strlen(data); rank['P']=rank['Q']=rank['R']=0; rank['0']=rank['1']=rank['2']=0; rank['+']=1; rank['*']=2; rank['-']=3; rank['(']=4; rank[')']=-1; while(!(data[0]=='.' && n==1)){ solve(n,data); scanf("%s",data); n=strlen(data); } } void solve(int n,char data[81]){ int point=0; int nowRank=0; char ts[3]; int count=0; bool kakkoFlag=false; for(r=0;r<3;r++){ for(p=0;p<3;p++){ for(q=0;q<3;q++){ while(mystack.empty()==false) mystack.pop(); point=1; mystack.push(data[0]); nowRank=rank[data[0]]; while(point<=n) { if(n==point || nowRank>rank[data[point]]) { if(point<n) { if(data[point]!=')') mystack.push(data[point]); nowRank=rank[data[point]]; if(data[point]==')') kakkoFlag=true; else kakkoFlag=false; } while(mystack.size()>1) { ts[0]=mystack.top(); mystack.pop(); ts[1]=mystack.top(); mystack.pop(); nowRank=rank[ts[1]]; if(ts[1]=='('){ if(ts[0]=='('){ mystack.push(ts[1]); if(kakkoFlag==false){ mystack.push(ts[0]); } break; }else if(ts[0]=='-'){ mystack.push(ts[1]); mystack.push(ts[0]); break; }else{ if(kakkoFlag==true){ mystack.push(ts[0]); break; }else{ mystack.push(ts[1]); mystack.push(ts[0]); break; } } }else if(ts[1]=='-'){ if(ts[0]=='-'){ mystack.push('-'); mystack.push('-'); break; }else if(ts[0]=='('){ mystack.push('-'); mystack.push('('); break; }else{ mystack.push(myNot(ts[0])); } }else if(ts[1]=='+' || ts[1]=='*'){ if(ts[0]=='-' || ts[0]=='('){ mystack.push(ts[1]); mystack.push(ts[0]); break; }else{ ts[2]=mystack.top(); mystack.pop(); if(ts[1]=='+'){ ts[0]=myOr(ts[2],ts[0]); }else if(ts[1]=='*'){ ts[0]=myAnd(ts[2],ts[0]); } mystack.push(ts[0]); } }else{ mystack.push(ts[1]); mystack.push(ts[0]); break; } } point++; }else{ if(n>point){ mystack.push(data[point]); nowRank=rank[mystack.top()]; point++; } } } if(myVer(mystack.top())==2) count++; } } } printf("%d\n",count); } void myprint(std::stack<char> my){ std::stack<char> nt; while(my.empty()==false){ nt.push(my.top()); my.pop(); } while(nt.empty()==false){ my.push(nt.top()); printf("%c",nt.top()); nt.pop(); } printf("\n"); } char myNot(char c){ int t=myVer(c); if(t==2){ return '0'; }else if(t==1){ return '1'; }else if(t==0){ return '2'; } return c; } int myVer(char c){ int t=c; if(c=='R'){ t=r; }else if(c=='P'){ t=p; }else if(c=='Q'){ t=q; }else if('3'>c && c>='0'){ t=c-'0'; } return t; } char myAnd(char c1,char c2){ char t[3][4]={"000","011","012"}; return t[myVer(c1)][myVer(c2)]; } char myOr(char c1,char c2){ char t[3][4]={"012","112","222"}; return t[myVer(c1)][myVer(c2)]; }
←解決時は質問者本人がここをチェックしてください。
戻る
掲示板システム
Copyright 2020 Takeshi Okamoto All Rights Reserved.