PAT(B) 1089 狼人殺-簡單版(Java)邏輯推理

題目連接: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

輸入樣例

輸入樣例 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

Java代碼

/********************************************************************************** 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");			// 未找到,無解
		}
	}
}

版權聲明遊戲

  1. 轉載、參考、引用必須在首頁添加以下文字:
    [PAT(B) 1089 狼人殺-簡單版(Java)邏輯推理—wowpH](https://blog.csdn.net/pfdvnah/article/details/97613402)
  2. 代碼原創,公開引用不能刪除首行註釋(做者,版本號,時間等信息);
  3. 若是有疑問歡迎評論區留言,儘可能解答;
  4. 若是有錯誤,還望大俠評論區指正。
相關文章
相關標籤/搜索