Online JudgeProblem SetAuthorsOnline ContestsUser
Web Board
F.A.Qs
Statistical Charts
Problems
Submit Problem
Online Status
Prob.ID:
Register
Authors ranklist
Current Contest
Past Contests
Scheduled Contests
Award Contest
Register

## 为什么一直OLE啊,请大家帮忙看看

Posted by Fgnore at 2007-11-24 01:41:11 on Problem 1048
```#include <vector>
#include <list>
#include <map>
#include <set>
#include <deque>
#include <stack>
#include <bitset>
#include <algorithm>
#include <functional>
#include <numeric>
#include <utility>
#include <sstream>
#include <iostream>
#include <string>
#include <iomanip>
#include <cstdio>
#include <cctype>
#include <cmath>
#include <cstdlib>
#include <queue>

using namespace std;

/*
½«ÊäÈë×ª»»Îªºó×º±í´ïÊ½,È»ºóÇó½â
*/

string getPostfix(int x,int y);
void goEnd(int &x,int &y);
int getResult(string postfix);
char OR(char a,char b);
char AND(char a,char b);
char NOT(char a);
#define MAX 102
char input[21];
char cir[MAX][MAX];

int main()
{
int cirCount=0;
int i,j,cirCnt;
int x0,y0;
while(cin)
{
if(cirCount==0)
{
cirCount=1;
}
else if(cirCount==1)
{
cout<<endl;
}
//init
for(i=0;i<MAX;i++)
{
for(j=0;j<MAX;j++)
{
cir[i][j]=' ';
}
}
//cin [][]
cirCnt=1;
if(cin.peek()==EOF)
{
return 0;
}
cin.getline(cir[cirCnt++],MAX-2);
while(strcmp(cir[cirCnt-1],"*"))
{
cin.getline(cir[cirCnt++],MAX-2);
}
bool ok=false;
for(i=cirCnt-2;i>0;i--)
{
for(j=MAX-1;j>0;j--)
{
if(cir[i][j]=='?')
{
x0=j;
y0=i;
cir[i][j]='+';
ok=true;
break;
}
}
if(ok)
{
break;
}
}
string postfix= getPostfix(x0,y0);

cin.getline(input,22);
while(strcmp(input,"*"))
{
cout<<getResult(postfix)<<"\n";
cin.getline(input,22);
}
}
return 0;
}

int getResult(string postfix)
{
stack<char> st;
for(int i=postfix.length()-1;i>=0;i--)
{
if(postfix[i]=='&')
{
char tmp1,tmp2;
tmp1=st.top();
st.pop();
tmp2=st.top();
st.pop();
st.push(AND(tmp1,tmp2));
}
else if(postfix[i]=='|')
{
char tmp1,tmp2;
tmp1=st.top();
st.pop();
tmp2=st.top();
st.pop();
st.push(OR(tmp1,tmp2));
}
else if(postfix[i]=='-')
{
char tmp;
tmp = st.top();
st.pop();
st.push(NOT(tmp));
}
else
{
st.push(input[postfix[i]-'A']);
}
}
return st.top()=='1'?1:0;
}
char OR(char a,char b)
{
return a=='0'&&b=='0'?'0':'1';
}
char AND(char a,char b)
{
return a=='1'&&b=='1'?'1':'0';
}
char NOT(char a)
{
return a=='1'?'0':'1';
}
string getPostfix(int x,int y)
{
string partPostfix;
partPostfix.erase();
goEnd(x,y);
//È¡·´ºÅ
char dot = cir[y][x];
if(dot=='o')
{
partPostfix="-";
partPostfix.append(getPostfix(x-1,y));
}
else if(dot==')')
{
partPostfix="&";
partPostfix.append(getPostfix(x-2,y-1));
partPostfix.append(getPostfix(x-2,y+1));
}
else if(dot=='>')
{
partPostfix="|";
partPostfix.append(getPostfix(x-2,y-1));
partPostfix.append(getPostfix(x-2,y+1));
}
else
{
//ÕÒµ½ÊäÈëÖµ
partPostfix.erase();
stringstream ss;
ss.clear();
ss<<dot;
ss>>partPostfix;
}
return partPostfix;
}

void goEnd(int &x,int &y)
{
//±ê¼ÇÄ¿µÄµØ
int cangoX=x,cangoY=y;
//Ö±µ½ÕÒµ½ºó×º±í´ïÊ½ÖÐµÄÔªËØ
while(1)
{
//Ïò×óÒÆ¶¯
while(cir[y][x-1]=='-')
{
x--;
cangoX = x-1;
}
//ÈôÊÇ'+',Ôò¼ÌÐø
if(cir[cangoY][cangoX]=='+')
{
//ÏòÉÏ
x=cangoX;
while(cir[y-1][x]=='|')
{
y--;
cangoY=y-1;
}
//ÏòÉÏÕýÈ·
if(cangoY!=y)
{
y=cangoY;
//Óöµ½×ªÕÛµã,¼ÌÐø
if(cir[cangoY][x]=='+')
{
continue;
}
//ÕÒµ½,·µ»Ø
else
{
return;
}
}
//Ó¦¸ÃÏòÏÂ
else
{
//¼ÈÈ»È·¶¨ÏòÏÂ,¾Í×ßµ½Í·
while(cir[y++][x]!='|'){}
//Èô½ÚµãÎª'+',¼ÌÐø
if(cir[y][x]=='+')
{
continue;
}
//·ñÔòÕÒµ½,·µ»Ø
else
{
return;
}
}
}
//Èô²»ÊÇ'+',ÔòÕÒµ½,·µ»Ø
else
{
x=cangoX;
return;
}
}

}

```

Followed by: