网友聚会解答
来源:互联网 发布:c语言的发展前景 编辑:程序博客网 时间:2024/04/30 03:39
#include <iostream>
using namespace std;
struct Condition
{
char type; // 逻辑运算符
char left; // 左项,X或P或A
int i; // 左项下标
char right; // 右项,P或A
int j; // 右项下标
bool value; // 真假的取值
};
Condition A[10]; // 记录表达式情况
int TrueTimes[10] = {0}; // 记录取真次数
bool P[4]; // 变元
void SetP(int i) // 枚举版主参加情况
{
P[0] = bool(i & 0x1);
P[1] = bool(i & 0x2);
P[2] = bool(i & 0x4);
P[3] = bool(i & 0x8);
}
bool LeftValue(const Condition &a) // 左项取值
{
if (a.left == 'A')
return A[a.i].value;
else
return P[a.i];
}
bool RightValue(const Condition &a) // 右项取值
{
if (a.right == 'A')
return A[a.j].value;
else
return P[a.j];
}
int OutValue(int allTimes, int trueTimes)
{
if (trueTimes == 0)
return -1;
if (trueTimes == allTimes)
return 1;
return 0;
}
int main()
{
int n, m; // 读入n, m
cin >> n >> m;
char c; // 辅助用
for (int i = 0; i < m; i++) // 读入m个逻辑表达式
cin >> c >> c >> A[i].left >> A[i].i
>> A[i].type >> A[i].right >> A[i].j;
int allTimes = 1 << n; // 先计算总的枚举次数
for (int i = 0; i < allTimes; i++)
{
SetP(i); // 枚举版主参加情况
// 依次计算网友参加情况
for (int j = 0; j < m; j++)
{
switch (A[j].type)
{
case '~':
A[j].value = !RightValue(A[j]);
break;
case '>':
A[j].value = !LeftValue(A[j]) || RightValue(A[j]);
break;
case '^':
A[j].value = LeftValue(A[j]) && RightValue(A[j]);
break;
case 'v':
A[j].value = LeftValue(A[j]) || RightValue(A[j]);
break;
}
if (A[j].value) // 参加聚会
TrueTimes[j] ++;
}
}
cout << OutValue(allTimes, TrueTimes[0]);
for (int i = 1; i < m; i++)
cout << ' ' << OutValue(allTimes, TrueTimes[i]);
cout << endl;
return 0;
}
- 网友聚会解答
- 08年第3期算法擂台,网友聚会题目的另一种解答
- IntegerSet解答
- DSP解答
- GADGETS解答
- VIM解答
- WAP 解答
- 第一章解答
- 习题解答
- 常见问题解答
- 题目解答
- ZOJ1037解答
- 求解答
- 试题解答
- 求解答
- 求解答
- 求解答
- 几个问题解答
- 学习VC++深入浅出——网络通讯编程
- 如何使一个批处理软件开机自动运行
- 再读C++ Primer 写了个小例子——网络编程
- 解析extern
- Tapestry4常用的注入对象
- 网友聚会解答
- window.open()参数列表
- 闲谈 Web 图片服务器
- C++学习笔记(17)——虚函数与构造函数、析构函数
- 赢得创投资金出资的七招式
- [记录]由Virtools的设计想到的实体系统...
- 字符,字节和编码
- Exceptional Performance : Best Practices for Speeding Up Your Web Site
- 学习VC++深入浅出——钩子的使用