POJ 3295 Tautology 构造法

http://poj.org/problem?id=3295

 

求出给定合式 当永为1的时候输出

tautology

否则输出

not

 

p,q,e,s,t  每个有0,1两种取值,所以总共32种情况,分别枚举即可。

 1 #include<stdio.h>

 2 #include<stdlib.h>

 3 #include<string.h>

 4 #define MAXN 120

 5 

 6 int sta[MAXN];

 7 char str[MAXN];

 8 int p,q,r,s,t;

 9 

10 void  solve()

11 {

12     int top=0;

13     int len=strlen(str);

14     int i;

15     for(i=len-1;i>=0;i--)                         //从后往前计算,求 出 

16                                                             //str[0]的值 即合式的值

17     {

18         if(str[i]=='p') sta[top++]=p;

19         else if(str[i]=='q')

20             sta[top++]=q;

21         else if(str[i]=='r')

22             sta[top++]=r;

23         else if(str[i]=='s')

24             sta[top++]=s;

25         else if(str[i]=='t')

26             sta[top++]=t;

27         else if(str[i]=='K')

28         {

29             int t1=sta[--top];

30             int t2=sta[--top];

31             sta[top++]=(t1&&t2);

32         }

33         else if(str[i]=='A')

34         {

35             int t1=sta[--top];

36             int t2=sta[--top];

37             sta[top++]=(t1||t2);

38         }

39         else if(str[i]=='N')

40         {

41             int t1=sta[--top];

42             sta[top++]=(!t1);

43         }

44         else if(str[i]=='C')

45         {

46             int t1=sta[--top];

47             int t2=sta[--top];

48             if(t1==1&&t2==0)

49             sta[top++]=0;

50             else

51             sta[top++]=1;

52         }

53         else if(str[i]=='E')

54         {

55             int t1=sta[--top];

56             int t2=sta[--top];

57             if((t1==1&&t2==1)||(t1==0&&t2==0))

58                 sta[top++]=1;

59             else sta[top++]=0;

60         }

61     }

62 }

63 int solve(char str[])

64 {                                                          //枚举p,q,r,s,t

65     for(p=0;p<2;p++)

66       for(q=0;q<2;q++)

67         for(r=0;r<2;r++)

68            for(s=0;s<2;s++)

69               for(t=0;t<2;t++)

70               {

71                   solve();

72                   if(sta[0]==0)

73                   return 0;

74               }

75     return 1;

76 }

77 

78 int main()

79 {

80     while(scanf("%s",&str)!=EOF)

81     {

82         if(strcmp(str,"0")==0)break;

83         if(solve(str))

84             printf("tautology\n");

85         else

86             printf("not\n");

87     }

88     return 0;

89 }
View Code

 

 

你可能感兴趣的:(auto)