POJ 3295 Tautology(递归、构造)

题意:http://blog.csdn.net/lyy289065406/article/details/6642766
并且,这篇文章中提到,采用栈的方法。想法值得学习。但感觉代码有点长。
我自己用vector写的如下:
#include<iostream>
#include<string>
#include<vector>
using namespace std;

vector<int> stack; //0代表false 1代表true.
string s;

int judge(int index, int val)
{
	int len = stack.size();
	if (index < 0)
	{
		int out = 1;
		for (int k = 0; k < len; ++k)
			if (stack[k] == 0){ out = 0; break; }
		return out;
	}
	if (islower(s[index]))
	{
		int temp;
		switch (s[index])
		{
			case 'p': temp = (val & 16) >> 4; break;
			case 'q': temp = (val & 8) >> 3; break;
			case 'r': temp = (val & 4) >> 2; break;
			case 's': temp = (val & 2) >> 1; break;
			case 't': temp = (val & 1) >> 0; break;
			default: return -1;
		}
		stack.push_back(temp);
	}
	else
	{
		if (len == 0) return -1; //针对这种情况:ApK---K后面没有元素
		if (s[index] == 'N') stack[ len - 1] = !stack[len - 1];//一个元素的情况只能是:Np
		else
		{
			if (len == 1)return -1;//针对这种情况:ApKq---K后面只有一个元素也不行
			int temp;
			switch (s[index])
			{
			case 'K': temp = stack[len - 1] & stack[len - 2];    break; //对stack的最后两个数进行操作,
			case 'A': temp = stack[len - 1] | stack[len - 2];    break; //操作后将这两个数移除,并将结果加入stack。
			case 'C': temp = (!stack[len - 1]) | stack[len - 2]; break;
			case 'E': temp = stack[len - 1] == stack[len - 2];   break;
			default:  return -1;
			}
			stack.pop_back();
			stack[len-2] = temp;
		}	
	}
	judge(index - 1, val);
}

int main()
{
	string out;
	while (cin >> s)
	{
		out = "tautology";
		int flag = 0;
		if (s == "0") break;
		for (int i = 0; i < 32; ++i) //pqrst:组成5位二进制数,例如00100,表示r==1,其他为0
		{
			stack.clear();
			flag = judge(s.length() - 1, i);
			if (flag == -1){ cout << "输入有误!"; break; }
			if (!flag){ out = "not"; break; }
		}
		if(flag!=-1)cout << out << endl;
	}
	return 0;
}
当然,网上还有更简单的,没有用到栈、vector之类的,就只有递归
(给我的启发式,代码写完后要再多看看、改改,进一步想想有没有更简单的方法了)
代码如下:http://www.cnblogs.com/asuran/archive/2009/09/28/1575379.html</span>
#include <iostream>  
#include <string>  
using namespace std;
static int pos = -1;
bool WFF(const string& formula, int i)
{
	++pos;
	switch (formula[pos])
	{
	case 'p':
		return i & 1;
	case 'q':
		return (i >> 1) & 1;
	case 'r':
		return (i >> 2) & 1;
	case 's':
		return (i >> 3) & 1;
	case 't':
		return (i >> 4) & 1;
	case 'N':
		return !WFF(formula, i);
	case 'K':
		return WFF(formula, i) & WFF(formula, i);
	case 'A':
		return WFF(formula, i) | WFF(formula, i);
	case 'C':
		return !WFF(formula, i) | WFF(formula, i);
	case 'E':
		return WFF(formula, i) == WFF(formula, i);
	}

	return false;
};
bool isTautology(string formula)
{
	for (int i = 0; i < 32; ++i)
	{
		pos = -1;
		if (WFF(formula, i) == false) return false;;
	}
	return true;
};
int main(int argc, char* argv[])
{
	string ln;
	while (cin >> ln && ln[0] != '0')
	{
		if (isTautology(ln)) cout << "tautology/n";
		else cout << "not/n";
	}
	return 0;
}


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值