SWUST OJ 东6宿舍灵异事件(0322)
东6宿舍灵异事件(0322)
Time limit(ms): 1000 Memory limit(kb): 65535 Submission: 88 Accepted: 31
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
Hint
SCPC - ChenYi
1 #include<stdio.h> 2 #include<string.h> 3 4 struct 5 { 6 char ch; 7 int pri; 8 }lpri[5]={{'=',0},{'(',1},{'+',3},{'*',5},{')',6}},rpri[5]={{'=',0},{'(',6},{'+',2},{'*',4},{')',1}}; 9 10 void Change(char *a) 11 { 12 if(*a=='T') 13 *a='1'; 14 else 15 *a='0'; 16 } 17 18 void Transform(char exp[],char a,char b,char c) 19 { 20 int len,i; 21 len=strlen(exp); 22 for(i=0;i<len;i++) 23 { 24 if(exp[i]=='a') 25 exp[i]=a; 26 if(exp[i]=='b') 27 exp[i]=b; 28 if(exp[i]=='c') 29 exp[i]=c; 30 if(exp[i]=='&') 31 exp[i]='*'; 32 if(exp[i]=='|') 33 exp[i]='+'; 34 } 35 } 36 37 int Lpri(char ch) 38 { 39 int i; 40 for(i=0;i<5;i++) 41 { 42 if(ch==lpri[i].ch) 43 { 44 return lpri[i].pri; 45 } 46 } 47 } 48 49 int Rpri(char ch) 50 { 51 int i; 52 for(i=0;i<5;i++) 53 { 54 if(ch==rpri[i].ch) 55 { 56 return rpri[i].pri; 57 } 58 } 59 } 60 61 void expTOpostexp(char exp[],char postexp[]) 62 { 63 int len,top=-1,t=0,i; 64 char op[100]; 65 len=strlen(exp); 66 for(i=0;i<len;) 67 { 68 if(exp[i]=='0'||exp[i]=='1') 69 { 70 postexp[t++]=exp[i++]; 71 } 72 else 73 if(Lpri(op[top])<Rpri(exp[i])||top==-1)//最开始栈顶是 -1 74 { 75 op[++top]=exp[i++]; 76 } 77 else 78 if(Lpri(op[top])>Rpri(exp[i])) 79 { 80 postexp[t++]=op[top--]; 81 } 82 else 83 if(Lpri(op[top])==Rpri(exp[i])) 84 { 85 top--; 86 i++; 87 } 88 } 89 for(i=top;i>-1;i--)//top就是栈顶的指针 90 { 91 postexp[t++]=op[top--]; 92 } 93 postexp[t]='\0'; 94 //printf("postexp:%s\n",postexp); 95 } 96 97 int Judge(char postexp[]) 98 { 99 int top=-1,len,i,num[100],a,b; 100 len=strlen(postexp); 101 for(i=0;i<len;i++) 102 { 103 if(postexp[i]=='0'||postexp[i]=='1') 104 num[++top]=postexp[i]-'0'; 105 if(postexp[i]=='+') 106 { 107 a=num[top--]; 108 b=num[top]; 109 num[top]=a+b; 110 } 111 if(postexp[i]=='*') 112 { 113 a=num[top--]; 114 b=num[top]; 115 num[top]=a*b; 116 } 117 } 118 return num[0]; 119 } 120 121 int main() 122 { 123 char exp[100],postexp[100]; 124 char a,b,c; 125 while(scanf("%s",exp)!=EOF) 126 { 127 getchar(); 128 scanf("%c",&a); 129 getchar(); 130 scanf("%c",&b); 131 getchar(); 132 scanf("%c",&c); 133 Change(&a); 134 Change(&b); 135 Change(&c); 136 Transform(exp,a,b,c); 137 //printf("exp:%s\n",exp); 138 expTOpostexp(exp,postexp); 139 if(Judge(postexp)) 140 printf("TRUE\n"); 141 else 142 printf("FALSE\n"); 143 } 144 return 0; 145 }
注:与运算可以看成是 *(乘法),或运算可看成是 +(加法),FALSE=0 TRUE=1,中缀表达式变后缀表达式并求值。