【输入样例1】
1 2
A0 X0 ~ P0
A1 A0 v P0
【输出样例1】
0 1
|
【输入样例2】
3 4
A0 P0 > P1
A1 P1 > P2
A2 P2 > P3
A3 P0 > P3
【输出样例2】
0 0 0 0
|
【输入样例3】
2 3
A0 P0 > P1
A1 P1 > A0
A2 X0 ~ A1
【输出样例3】
0 1 -1
|
#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;
}