poj3295 栈+递归的使用

//poj3295 判断是否永真式 情况很多很复杂 必须用特殊的数据结构
//栈+递归的使用 5个变量取值的全部情况 32种情况都是真才是tautology 
//好开心,居然一次AC。。 
#include <iostream>
#include <cmath>
#include <string>
using namespace std;
char stack[105];
int top = 0;
string ss[32] =  {
	"00000", "00001", "00010", "00011", "00100", "00101", "00110",
	"00111", "01000", "01001", "01010", "01011", "01100", "01101", "01110",
	"01111", "10000", "10001", "10010", "10011", "10100", "10101",
	"10110", "10111", "11000", "11001", "11010", "11011", "11100", "11101",
	"11110", "11111"
};
bool var(char c)
{
	if(c == '1' || c == '0')
		return true;
	return false;
}
char not2(char c)
{
	if(c == '1')
		return '0';
	else
		return '1';
}
char and2(char c, char c2)
{
	if(c=='1' && c2=='1')
		return '1';
	else
		return '0';
}
char or2(char c, char c2)
{
	if(c == '0' && c2 == '0')
		return '0';
	else
		return '1';
}
char implies2(char c, char c2)
{
	if(c == '1' && c2 == '0')
		return '0';
	else
		return '1';
}
char equals2(char c, char c2)
{
	if(c != c2)
		return '0';
	else
		return '1';
}
bool deal(int i, int j)
{
	if(i == j)
	{
		if(stack[i] == '1')
			return true;
		else
			return false;
	}
	int k = i;
	while(var(stack[k--]));
	k++;
	
	if(stack[k] == 'N')
	{
		stack[k] = not2(stack[k+1]);
		for(int m = k+2; m <= i; m++)
		{
			stack[m-1] = stack[m];
		}
		return deal(i-1, j);
	}
	else if(var(stack[k+1]) && var(stack[k+2]))
	{
		switch(stack[k])
		{
		case 'K':
			stack[k] = and2(stack[k+1], stack[k+2]);
			break;
		case 'A':
			stack[k] = or2(stack[k+1], stack[k+2]);
			break;
		case 'C':
			stack[k] = implies2(stack[k+1], stack[k+2]);
			break;
		case 'E':
			stack[k] = equals2(stack[k+1], stack[k+2]);
			break;
		}
		for(int m = k + 3; m <= i; m++)
		{
			stack[m-2] = stack[m];
		}
		return deal(i-2, j);
	}
}
int main()
{
	string a;
	getline(cin, a);
	while(a.compare("0") != 0)
	{
		bool ok = true;
		for(int j = 0; j < 32; j++)
		{
			memset(stack, 0, sizeof(stack));
			top = 0;
			for(int i = 0; i < a.length(); i++)
			{
				//替换变量为1 0 然后存入栈中 
				stack[i] = a[i];
				top++;
				if(a[i] == 'p')
				{
					stack[i] = ss[j][0];
				}
				else if(a[i] == 'q') 
				{
					stack[i] = ss[j][1];	
				}
				else if(a[i] == 'r')
				{
					stack[i] = ss[j][2];	
				}
				else if(a[i] == 's')
				{
					stack[i] = ss[j][3];	
				}
				else if(a[i] == 't')
				{
					stack[i] = ss[j][4];	
				}
				
			}
			ok = deal(top - 1, 0);
			if(!ok)
			{
				cout<<"not"<<endl; 
				break;
			} 
		}
		if(ok)
		{
			cout<<"tautology"<<endl;
		}
		getline(cin, a);
	}
	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值