思路:1)使用递归模拟,用备忘录优化,否则超时
另外:学到了一个不用递归即可枚举构造0-1序列的方法
for(i=0;i<32;i++)
for(j=0;j<5;j++)
arr[j]=(i>>j)%2;
【源程序】:
#include "stdio.h"
#include "string.h"
int arr[101],flag,note[101][101];
int IsCorrect(char *s,int start,int end)
{
if(note[start][end]!=-1) return note[start][end];
int i;
if(end==start)
{
if(s[start]<='t'&&s[start]>='p')
{
note[start][end]=arr[s[start]-'p'];
return note[start][end];
}
else
{
note[start][end]=2;
return note[start][end];
}
}
else if(s[start]=='N')
{
if(IsCorrect(s,start+1,end)==0)
{
note[start][end]=1;
return note[start][end];
}
else if(IsCorrect(s,start+1,end)==1)
{
note[start][end]=0;
return note[start][end];
}
else
{
note[start][end]=2;
return note[start][end];
}
}
else if(s[start]=='E'||s[start]=='C'||s[start]=='A'||s[start]=='K')
{
int sig=2;
for(i=1;i<end-start;i++)
{
int a=IsCorrect(s,start+1,start+i);note[start+1][start+i]=a;
int b=IsCorrect(s,start+i+1,end);note[start+i+1][end]=b;
if(a<=1 && b<=1)
{
switch(s[start])
{
case'K':sig=(a&&b);break;
case'A':sig=(a||b);break;
case'C':sig=(!a||b);break;
case'E':sig=!(a^b);break;
}
}
if(sig==1)
return note[start][end]=1;
}
return note[start][end]=sig;
}
else
{
return (note[start][end]=2);
}
}
int main()
{
//freopen("input.txt","r",stdin);
int len,i,j;
char s[260];
while((scanf("%s",s))!=EOF)
{
if(strcmp(s,"0")==0) break;
len=strlen(s);
memset(arr,0,sizeof(arr));
flag=1;
for(i=0;i<32;i++)
{
for(j=0;j<5;j++)
arr[j]=(i>>j)%2;
for(int p=0;p<len;p++)
for(int q=0;q<len;q++)
note[p][q]=-1;
flag=IsCorrect(s,0,len-1);
if(flag!=1) break;
}
if(flag==1)
printf("tautology\n");
else
printf("not\n");
}
return 0;
}
2)别人的思路:用栈模拟0MS
【程序】:
#include<iostream>
#include<string>
#include<stack>
using namespace std;
bool Judge(int p,int q,int r,int s,int t,string st)
{
stack<int> s_num;
int buff_1,buff_2;
string::size_type n = st.size();
for(n=n-1;n!=-1;n--)
{
if(st[n]<='t'&&st[n]>='p')
{
switch(st[n])
{
case 't':s_num.push(t);continue;
case 's':s_num.push(s);continue;
case 'r':s_num.push(r);continue;
case 'q':s_num.push(q);continue;
case 'p':s_num.push(p);continue;
}
}
else
{
if(st[n]=='N')
{
buff_1 = s_num.top();s_num.pop();
s_num.push(!buff_1);
}
else if(st[n]=='A')
{
buff_1 = s_num.top();s_num.pop();
buff_2 = s_num.top();s_num.pop();
s_num.push(buff_2||buff_1);
}
else if(st[n]=='K')
{
buff_1 = s_num.top();s_num.pop();
buff_2 = s_num.top();s_num.pop();
s_num.push(buff_2&&buff_1);
}
else if(st[n]=='E')
{
buff_1 = s_num.top();s_num.pop();
buff_2 = s_num.top();s_num.pop();
s_num.push(buff_2==buff_1);
}
else
{
buff_1 = s_num.top();s_num.pop();
buff_2 = s_num.top();s_num.pop();
s_num.push((!buff_1)||buff_2);
}
}
}
//cout<<s_num.top()<<endl;
if(!s_num.top())
return false;
return true;
}
int main()
{
string st;
while(cin>>st)
{
string::size_type i = 0;
if(st[i]=='0')
break;
int p(0),q(0),r(0),s(0),t(0),flag(0);
for(p=0;p!=2;p++)
{
for(q=0;q!=2;q++)
{
for(r=0;r!=2;r++)
{
for(s=0;s!=2;s++)
{
for(t=0;t!=2;t++)
{
if(!Judge(p,q,r,s,t,st))
{
flag=1;
}
}
if(flag==1)
break;
}
if(flag==1)
break;
}
if(flag==1)
break;
}
if(flag==1)
break;
}
if(flag==1)
cout<<"not"<<endl;
else
cout<<"tautology"<<endl;
}
return 0;
}