1089 狼人殺 簡單版 20 分

2021-09-24 09:39:42 字數 3563 閱讀 3837

題意描述:

以下文字摘自《靈機一動·好玩的數學》:「狼人殺」遊戲分為狼人、好人兩大陣營。在一局「狼人殺」遊戲中,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 人說的不是實...