題目連接:1089 狼人殺-簡單版 (20 point(s))java
如下文字摘自《靈機一動·好玩的數學》:「狼人殺」遊戲分爲狼人、好人兩大陣營。在一局「狼人殺」遊戲中,1 號玩家說:「2 號是狼人」,2 號玩家說:「3 號是好人」,3 號玩家說:「4 號是狼人」,4 號玩家說:「5 號是好人」,5 號玩家說:「4 號是好人」。已知這 5 名玩家中有 2 人扮演狼人角色,有 2 人說的不是實話,有狼人撒謊但並非全部狼人都在撒謊。扮演狼人角色的是哪兩號玩家?spa
本題是這個問題的升級版:已知 N 名玩家中有 2 人扮演狼人角色,有 2 人說的不是實話,有狼人撒謊但並非全部狼人都在撒謊。要求你找出扮演狼人角色的是哪幾號玩家?.net
輸入在第一行中給出一個正整數 N(5≤N≤100)。隨後 N 行,第 i 行給出第 i 號玩家說的話(1≤i≤N),即一個玩家編號,用正號表示好人,負號表示狼人。code
若是有解,在一行中按遞增順序輸出 2 個狼人的編號,其間以空格分隔,行首尾不得有多餘空格。若是解不惟一,則輸出最小序列解 —— 即對於兩個序列 A=a[1],…,a[M] 和 B=b[1],…,b[M],若存在 0≤k<M 使得 a[i]=b[i] (i≤k),且 a[k+1]<b[k+1],則稱序列 A 小於序列 B。若無解則輸出 No Solution。blog
5 -2 +3 -4 +5 +4
1 4
6 +6 +3 +1 -5 -2 +4
1 5
5 -2 -3 -4 -5 -1
No Solution
/********************************************************************************** Submit Time Status Score Problem Compiler Run Time User 7/28/2019, 12:32:52 Accepted 20 1089 Java (openjdk) 80 ms wowpH **********************************************************************************/ import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; public class Main { // w1,w2是狼,word是玩家說的話 private static boolean judge(int w1, int w2, int word) {// 判斷是不是真話 if (word < 0 && (0 == word + w1 || 0 == word + w2)) { return true; // 語義:某位玩家是狼,而且他真的是狼 } else if (word > 0 && word != w1 && word != w2) { return true; // 語義:某位玩家是人,而且他真的是人 } return false; // 不然是謊言 } public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); int n = Integer.parseInt(br.readLine()); // 玩家人數 int[] word = new int[n + 1]; // 玩家說的話 for (int i = 1; i <= n; ++i) { word[i] = Integer.parseInt(br.readLine()); } boolean find = false; // 初始未找到狼 for (int i = 1; i < n && !find; ++i) { // 假設第i位是狼,且未找到狼 for (int j = i + 1; j <= n && !find; ++j) { // 假設第j位是狼,且未找到狼 boolean word1 = judge(i, j, word[i]); // i說的話 boolean word2 = judge(i, j, word[j]); // j說的話 if (word1 && !word2 || !word1 && word2) {// 一真一假 int liePeopleNum = 0; // 說謊的「好人」數 // 遍歷「好人」,找到說謊的「好人」數 for (int k = 1; k <= n && liePeopleNum <= 1; ++k) { if (k != i && k != j && !judge(i, j, word[k])) { ++liePeopleNum; // k(「好人」)說假話,說謊的「好人」數加1 } } if (1 == liePeopleNum) { // 有且僅有一個「好人」說謊 find = true; // 已找到 System.out.println(i + " " + j);// i和j是狼 } } } } if (false == find) { System.out.println("No Solution"); // 未找到,無解 } } }
版權聲明遊戲
[PAT(B) 1089 狼人殺-簡單版(Java)邏輯推理—wowpH](https://blog.csdn.net/pfdvnah/article/details/97613402)