题目链接:http://acm.swust.edu.cn/problem/322/
Time limit(ms): 1000 Memory limit(kb): 65535
Description
将军听说最近东6闹鬼了,作为一个无神论者,将军当然不相信。但是这个传言已经泛滥了,许多人都在说这个事情,将军从每个人那里听到一个传言,将军可以容易的就知道这个传言是真还是假,但是当一大堆消息组合起来,将军就不知道了,所以将军就找到了你。
提供两种组合方式:
A&B:代表A和B都为真的时候,A和B组合起来为真,否则为假
A|B:代表A和B里面至少有1个为真的时候,A和B组合起来为真,否则为假
优先级顺序 “括号”>“&”>“|”
例如:a&b|(a|b&c),a=真,b=假,c=真;
那么上式可以这样转化
真&假 | (真|假&真)
假 | (真|假)
假 | 真
真
提供两种组合方式:
A&B:代表A和B都为真的时候,A和B组合起来为真,否则为假
A|B:代表A和B里面至少有1个为真的时候,A和B组合起来为真,否则为假
优先级顺序 “括号”>“&”>“|”
例如:a&b|(a|b&c),a=真,b=假,c=真;
那么上式可以这样转化
真&假 | (真|假&真)
假 | (真|假)
假 | 真
真
Input
有多组测试数据,每组测试数据共两行,第一行是一个逻辑范式,数据不用判错;
接下来三个字符,以空格隔开,分表代表a,b,c的真假(T/F);
接下来三个字符,以空格隔开,分表代表a,b,c的真假(T/F);
Output
对于每一组数据,输出最终的结果(TRUE or FALSE);
Sample Input
a&b|(a|b&c))
T F T
|
Sample Output
TRUE |
SCPC - ChenYi
解题思路:更具a,b,c是否为真将其转换为1,0,再把中缀表达式转化为后缀表达式 ’|‘ 运算看做'+',把’&‘运算看做'*',然后看最后的结果就是~~~
代码如下:
1 #include<iostream> 2 #include<cstring> 3 #include<stack> 4 using namespace std; 5 char s[10001], v[10001], a, b, c; 6 void get_val(char &x){ 7 if (x == 'T') 8 x = '1'; 9 else 10 x = '0'; 11 } 12 int judge(char x, char y){ 13 if (x == '(') return -1; 14 if (x == '+') 15 return y == '*' ? -1 : 0; 16 if (x == '*') 17 return y == '+' ? 1 : 0; 18 } 19 void change(){ 20 stack<char> Q; 21 int i, k = 0; 22 for (i = 0; s[i] != '