这是所谓的二叉树么.. 算法很简单, 只是因为第一次用这种结构体封装, 还是试了很多次才摸索出来的.. 很好用诶! 记一下
细节.. 地址和变量不要搞混了.. fw?fw->v():false 我写成了fw->v()? 错了好久
#include <stdio.h> #include <string.h> #include <stdlib.h> struct Orz { Orz *fw,*fx; bool (*f)(bool w,bool x); bool v() { return (*f)(fw?fw->v():false,fx?fx->v():false); }; bool p[5]; char sb[]={'K','A','C','E','N','p','q','r','s','t'}; char input[201]; int count; bool fK(bool w,bool x) { return w&x; } bool fA(bool w,bool x) { return w|x; } bool fC(bool w,bool x) { return !(w&&!x); } bool fE(bool w,bool x) { return !(w^x); } bool fN(bool w,bool x) { return !w; } bool fp(bool w,bool x) { return p[0]; } bool fq(bool w,bool x) { return p[1]; } bool fr(bool w,bool x) { return p[2]; } bool fs(bool w,bool x) { return p[3]; } bool ft(bool w,bool x) { return p[4]; } bool (*f[])(bool w,bool x)={fK,fA,fC,fE,fN,fp,fq,fr,fs,ft}; Orz *proc() { char a=input[count++]; Orz *node=(Orz *)malloc(sizeof(Orz)); node->fw=node->fx=NULL; int type; for(type=0;sb[type]!=a;type++); node->f=f[type]; if(type<=4) node->fw=proc(); if(type<4) node->fx=proc(); return node; } int pow2(int n) { int r=1; for(int i=0;i<n;i++) r*=2; return r; } int main() { while(1) { gets(input); if(input[0]=='0') break; count=0; Orz *bigBang=proc(); short tester; for(tester=0x0000;tester<=0x001f;tester++) { for(int i=0;i<5;i++) p[i]=tester/pow2(i)%2; if(bigBang->v()!=true) break; } if(tester==0x0020) printf("tautology\n"); else printf("not\n"); } return 0; }