#P1994. Logic
Logic
当前没有测试数据。
描述
在KOKODáKH系列中有一个逻辑游戏“Of Liars and Honest Men”。这个游戏可以有任意数量的玩家参与,且不需要特殊道具。规则很简单:每个玩家通过抛硬币决定自己是“骗子”(Liar)还是“诚实者”(Honest)。其他所有玩家都知道他的身份。角色确定后,游戏开始。诚实者必须始终说真话,骗子必须始终说谎。任何违反这一简单规则的人将输掉游戏。这个游戏非常有趣,高手可以构建非常复杂的陈述,而理解其含义非常困难。顶级玩家可以连续玩好几天而不犯错,他们的孩子和妻子会在全镇到处找他们。
当有新人进入房间并听他们说话时,玩家们会认为这是最佳情况。他们不会停止游戏,而是想给新人留下深刻印象,因此陈述会变得更加复杂。旁观者唯一能做的就是仔细听并试图确定谁是谁。最好的方法是证明某人犯了错误,因为这将结束游戏。但不幸的是,这并不容易。你需要编写一个计算机程序,能够听取对话并尝试确定谁是骗子。
输入
输入包含个测试用例。第一行是一个正整数Z,表示测试用例的数量。
每个测试用例以一个空行开始,与前一个用例分隔。然后是一个数字,表示玩家的数量。接下来的P行是每个玩家的名字。名字由字母组成,首字母大写,其余小写。名字的长度为到个字符,且不会出现或。
接下来是一个数字,表示接下来的陈述数量。然后是行,每行的格式为:玩家名字、冒号、一个空格、陈述内容、句号。每行不超过个字符。陈述内容有以下几种形式 (X、Y、Z是非负整数;H、F是玩家名字;V、W是陈述内容):
X + Y = Z
H je poctivec (H是诚实者)
H je lhar (H是骗子)
H rika "V". (H说“V”)
H rika "V" a je to opravdu tak (H说“V”且这是真的)
H rika "V", ale neni to pravda (H说“V”但这是假的)
Poctivcu je mene nez X (诚实者少于X)
Poctivcu je vice nez X (诚实者多于X)
Poctivcu je alespon X (诚实者至少X)
Lharu je mene nez X (骗子少于X)
Lharu je vice nez X (骗子多于X)
Lharu je alespon X (骗子至少X)
(V) a zaroven (W) ((V)且(W))
(V) nebo (W) ((V)或(W))
类型4的陈述为真当且仅当玩家H可以在不违反规则的情况下说V(即如果V为假且H是骗子,或V为真且H是诚实者)。类型5和6的陈述由两部分独立组成(“H说V”和“V是真的/假的”)。如果陈述的作者是骗子,这两部分必须都为假;如果是诚实者,两部分必须都为真。如果一部分为真另一部分为假,则称为“不可满足”,没有人可以在不违反规则的情况下说这种陈述。类型7到12的陈述表示骗子或诚实者的总数(包括作者自己)。类型13的陈述为真当且仅当两部分都为真;类型14的陈述为真当至少一部分为真。如果类型13或14的某一部分是不可满足的,则视为假。即使两个不可满足的陈述通过“且”或“或”连接,结果也是假(而不是不可满足)。这意味着骗子可以说这种陈述。
输出
对于每个测试用例,首先输出一行 “Hra cislo X:”(游戏编号X),X从开始。
第一步,假设没有玩家违反规则(骗子说假话,诚实者说真话)。如果存在一种玩家身份分配使得所有陈述都可以被满足,则称这组陈述是“可满足的”。如果输入是可满足的,程序需要输出所有可以确定的身份。每个身份单独一行,格式为“H je lhar.”(H是骗子)或“H je poctivec.”(H是诚实者)。如果有多个身份需要输出,按输入中玩家名字的顺序输出。如果无法确定任何玩家的身份,输出“Neda se nic zjistit.”(无法确定任何信息)。
如果陈述组不可满足,显然有玩家违反了规则并输掉了游戏。我们需要尝试确定是谁。假设只有一个玩家犯错。如果玩家F违反了规则,我们不需要考虑他的所有“主要”陈述(即直接由F说的陈述),但“F说V”中的“V”仍然有效,因为其语义是“F可以在遵守规则的情况下说V”。
如果移除某个玩家的“主要”陈述后,陈述组变为可满足的,且只有一个这样的玩家,输出“F prohral.”(F输了)。如果有多个这样的玩家,输出“Prohral nektery z techto hracu: F1, F2, F3.”(以下玩家中有人输了:F1, F2, F3)。如果没有这样的玩家,输出“Pravidla porusilo vice hracu.”(多个玩家违反了规则)。
每个测试用例后输出一个空行(包括最后一个)。
示例输入1
2
3
Petr
Josef
Marie
1
Petr: Petr je lhar.
3
Petr
Josef
Marie
1
Josef: Marie rika "Marie je lhar" a je to opravdu tak.
##示例输出1
Hra cislo 1:
Petr prohral.
Hra cislo 2:
Josef je lhar.
Marie je poctivec.
来源
CTU Open 1999