poj 3295
题目意思就是计算表达式的值,如果所有情况下表达式为真就输出“tautology”,否则输出“not”。
p, q, r, s, and t,每个人有两种情况,综合起来一共有32种情况,枚举所有情况最后所有情况是真的话就是真。
K, A, N, C,E分别代表的是计算方式,e.iK代表逻辑语&,A代表逻辑语|,剩下的可以自己推了;
思路:先做一个预处理将所有情况都存到一个数组里面,然后就每一个情况分别枚举,处理方式的话是从表达式的最后面向前处理;
因为是一个表达式,所以最后得到的结果只有一个数值,然后判断它是否为真就行了(注意一下:要将整个表达式的值在这一种情况下计算完才可以进行表达式真 假判断)
#include<cstdio> #include<iostream> #include<cstring> using namespace std; int num[35][6]; char s[105]; int main() { for(int i=0;i<32;++i) for(int j=0;j<5;++j) if(i&(1<<j)) num[i][j]=1; else num[i][j]=0; while(scanf("%s",s)==1) { if(s[0]=='0') break; int flag=1; for(int k=0;k<32;++k){ int len=strlen(s); int top=0;int goal[105]; for(int j,i=len-1;i>=0;--i){ if(s[i]>='p'&&s[i]<='t') goal[top++]=num[k][s[i]-'p']; else if(s[i]=='K'){ goal[top-2]=goal[top-2]&&goal[top-1];--top; } else if(s[i]=='A'){ goal[top-2]=goal[top-2]||goal[top-1];--top; } else if(s[i]=='N') goal[top-1]=!goal[top-1]; else if(s[i]=='C'){ goal[top-2]=!goal[top-2]||goal[top-1];--top; } else if(s[i]=='E'){ goal[top-2]=goal[top-2]==goal[top-1];--top; } } if(goal[0]==0) flag=0; if(flag==0) break; } if(flag) cout << "tautology\n"; else cout << "not\n"; } }
别人递归的方法,学习学习
#include<stdio.h> 02.#include<stdlib.h> 03.#include<string.h> 04.int state[5]; 05.char s[205]; 06.int l=0; 07.int ind() 08.{ 09. char ch=s[l++]; 10. printf(""); 11. 12. switch(ch) 13. { 14. case 'p': 15. case 'q': 16. case 'r': 17. case 's': 18. case 't': 19. return state[ch-'p']; 20. break; 21. case 'K': 22. return ind()&ind(); 23. break; 24. case 'A': 25. return ind()|ind(); 26. break; 27. case 'N': 28. return !ind(); 29. break; 30. case 'C': 31. return !ind()|ind(); 32. break; 33. case 'E': 34. return ind()==ind(); 35. break; 36. } 37.} 38. 39.int main() 40.{ 41. scanf("%s", s); 42. while(s[0]!='0') 43. { 44. int len=strlen(s); 45. int mark=1; 46. for(state[0]=0; state[0]<=1 && mark; state[0]++) 47. { 48. for(state[1]=0; state[1]<=1 && mark; state[1]++) 49. { 50. for(state[2]=0; state[2]<=1 && mark; state[2]++) 51. { 52. for(state[3]=0; state[3]<=1 && mark; state[3]++) 53. { 54. for(state[4]=0; state[4]<=1 && mark; state[4]++) 55. { 56. l=0; 57. if(ind()==0) 58. mark=0; 59. } 60. } 61. } 62. } 63. } 64. if(mark==1) 65. printf("tautology\n"); 66. else 67. printf("not\n"); 68. scanf("%s", s); 69. } 70. return 0; 71.}
挺巧妙的、