1. 程式人生 > >[PAT-B] 1089 狼人殺-簡單版(20)

[PAT-B] 1089 狼人殺-簡單版(20)

題目連結 - 技術文件

題目描述


以下文字摘自《靈機一動·好玩的數學》:“狼人殺”遊戲分為狼人、好人兩大陣營。在一局“狼人殺”遊戲中,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<M 使得 a[i]=b[i] (i≤k),且a[k+1]<b[k+1],則稱序列 A 小於序列 B。若無解則輸出 No Solution

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

解題思路


剛開始以為可以找到規律,最後仍然逃離不了暴力解決,i和j表示第i個和第j個為狼人然後一一判斷,是否有且僅有兩個說謊的人,同時他們一個是好人一個是狼人

程式碼設計
//AC程式碼
//zhicheng
#include<cstdio>
#include<iostream>
#include<vector>
using namespace std;
// zhicheng
// September,10,2018
int main() 
{
    freopen("1.in","r",stdin);
    int
n,d[105];scanf("%d",&n); for (int i = 1; i <= n; i++) scanf("%d",&d[i]); for (int i = 1; i <= n; i++) { for (int j = i + 1; j <= n; j++) { int re[105],cnt=0; vector<int> a(n + 1, 1); a[i] = a[j] = -1; for (int k = 1; k <= n; k++) if (d[k] * a[d[k]<0?-d[k]:d[k]] < 0) re[cnt++] = k; if (cnt == 2 && a[re[0]] + a[re[1]] == 0) {// 判斷是否僅有兩個說謊的人,並且一個是好人一個是狼人 printf("%d %d\n",i,j); return 0; } } } printf("No Solution\n"); return 0; }

鋪子日常更新,如有錯誤請指正