題意描述:
以下文字摘自《靈機一動·好玩的數學》:「狼人殺」遊戲分為狼人、好人兩大陣營。在一局「狼人殺」遊戲中,1 號玩家說:「2 號是狼人」,2 號玩家說:「3 號是好人」,3 號玩家說:「4 號是狼人」,4 號玩家說:「5 號是好人」,5 號玩家說:「4 號是好人」。已知這 5 名玩家中有 2 人扮演狼人角色,有 2 人說的不是實話,有狼人撒謊但並不是所有狼人都在撒謊。扮演狼人角色的是哪兩號玩家?
本題是這個問題的公升級版:已知 n 名玩家中有 2 人扮演狼人角色,有 2 人說的不是實話,有狼人撒謊但並不是所有狼人都在撒謊。要求你找出扮演狼人角色的是哪幾號玩家?
輸入格式:
輸入在第一行中給出乙個正整數 n(5≤n≤100)。隨後 n 行,第 i 行給出第 i 號玩家說的話(1≤i≤n),即乙個玩家編號,用正號表示好人,負號表示狼人。
輸出格式:
如果有解,在一行中按遞增順序輸出 2 個狼人的編號,其間以空格分隔,行首尾不得有多餘空格。如果解不唯一,則輸出最小序列解 —— 即對於兩個序列 a=a[1],…,a[m] 和 b=b[1],…,b[m],若存在 0≤k輸入樣例 1:
5
-2+3
-4+5
+4
輸出樣例 1:
1 4
輸入樣例 2:
6
+6+3
+1-5
-2+4
輸出樣例 2(解不唯一):
1 5
輸入樣例 3:
5
-2-3
-4-5
-1
輸出樣例 3:
no solution
解題思路:alice: (¦3」∠),沒思路。
bob:沒思路,(¦3」∠)。
alice: 這種題算(・◇・)?神馬,博弈論嗎》
bob: 應該沒這麼高深吧,會不會是模擬題,就是邏輯稍微沒那麼明顯。
alice: 輸出最小序列解,最小序列是blahblah,…最小序列不就是一般的遍歷二維陣列的順序嗎???
bob: emm, 你這麼一說,還真是的,就是一般遍歷二維陣列的順序。
alice: 有兩個狼人,狼人中有且僅有乙個人撒謊,一共有兩人撒謊。這是不是就是邏輯啊,我們先假設出兩個具體的狼人,然後去判斷是不是狼人中有且僅有乙個人撒謊,一共有兩人撒謊,如果是,就說明假設是成立的,如果不是就再看下一對,這樣一直找下去,如果最後一對也找不到就是「no solution」
bob: w(°o°)w‼(•『╻』•)꒳ᵒ꒳ᵎ(σ゚∀゚)σ…:*☆ 哎喲不錯哦。我們可以記錄下所有人說謊的次數和所有說謊人,然後判斷說謊的次數是不是等於2並且說謊的人裡面是不是只有乙個狼人。
alice: 只有兩種謊言,一種是把狼人當成好人,一種是把好人當成狼人。
bob: √√√√√√
**:
def
main()
: n =
int(
input()
)# 接收輸入的正整數 n
data =
for x in
range
(n):
int(
input()
))# 依次讀入 n 位玩家的發言, n 個整數
answer =
"no solution"
# 先假定沒有答案
for x in
range
(n):
for y in
range
(x +
1, n)
:# 從小序列到大序列依次嘗試,就是從(1,2)(1,3)。。。(3,4)的順序嘗試
if check(data, x, y)
:# 如果讓 x, y 作為狼人是符合題意的
answer =
"{} {}"
.format
(x +
1, y +1)
break
# 馬上 break 出去,不然可能會被較大序列的狼人對替代
if answer !=
"no solution"
:# 接著上面,馬上break 出去
break
print
(answer)
# 輸出答案
defcheck
(data, x, y)
:# 判斷 x, y 作為狼人是否可行
lies =
0# n 位玩家中說謊的人的個數
liers =
# n 位玩家中說謊的人
wolfs =
[x +
1, y +1]
# 事實,我們假設 x, y 是狼人,x, y為下標,加一才是大家所講的編號。
for index, _ in
enumerate
(data)
:# 依次檢驗眾人的發言
if data[index]
<
0and data[index]*-
1not
in wolfs:
# 把好人當成狼人,說謊
lies +=
1 liers.extend(
[index]
)# 記錄說謊的次數和說謊的人
if data[index]
>
0and data[index]
in wolfs:
# 把狼人當成好人,說謊
lies +=
1 liers.extend(
[index]
)# 記錄說謊的次數和說謊的人
if x in liers and y not
in liers and lies ==2:
# 狼人中有且只有一人說謊 且 共有兩人說謊, 符合題意
return
true
if x not
in liers and y in liers and lies ==2:
# 狼人中有且只有一人說謊 且 共有兩人說謊,符合題意
return
true
# 否則不符合題意
return
false
if __name__ ==
'__main__'
: main(
)
易錯點:總結:
for relax :
1089 狼人殺 簡單版 (20 分)
以下文字摘自 靈機一動 好玩的數學 狼人殺 遊戲分為狼人 好人兩大陣營。在一局 狼人殺 遊戲中,1 號玩家說 2 號是狼人 2 號玩家說 3 號是好人 3 號玩家說 4 號是狼人 4 號玩家說 5 號是好人 5 號玩家說 4 號是好人 已知這 5 名玩家中有 2 人扮演狼人角色,有 2 人說的不是實...
1089 狼人殺 簡單版 20 分
以下文字摘自 靈機一動 好玩的數學 狼人殺 遊戲分為狼人 好人兩大陣營。在一局 狼人殺 遊戲中,1 號玩家說 2 號是狼人 2 號玩家說 3 號是好人 3 號玩家說 4 號是狼人 4 號玩家說 5 號是好人 5 號玩家說 4 號是好人 已知這 5 名玩家中有 2 人扮演狼人角色,有 2 人說的不是實...
1089 狼人殺 簡單版 20分
以下文字摘自 靈機一動 好玩的數學 狼人殺 遊戲分為狼人 好人兩大陣營。在一局 狼人殺 遊戲中,1 號玩家說 2 號是狼人 2 號玩家說 3 號是好人 3 號玩家說 4 號是狼人 4 號玩家說 5 號是好人 5 號玩家說 4 號是好人 已知這 5 名玩家中有 2 人扮演狼人角色,有 2 人說的不是實...