1089 狼人殺-簡單版 (20 分)(cj)
阿新 • • 發佈:2018-12-09
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
題目的資料規模很小,但是很難想。 就是 倆個狼人 一個說謊 和一個說謊的平民 , 直接列舉暴力即可。
code
#pragma warning(disable:4996) #include <iostream> #include <vector> #include <algorithm> using namespace std; int varr[105]; int map[105]; int tmp[105]; int n, x; void init(); int main() { cin >> n; for (int i = 1; i <= n; ++i) { cin >> varr[i]; } bool f = 1, ff = 0; for (int i = 1; i < n; ++i) { for (int j = i + 1; j <= n; ++j) { for (int k = 1; k <= n; ++k) { if (k == i || k == j) continue; init(); tmp[i] = -varr[i]; tmp[k] = -varr[k]; map[i] = 1; map[j] = 1; for (int i = 1; i <= n; ++i) { if ((tmp[i] > 0 && map[tmp[i]] == 0) || (tmp[i] < 0 && map[-tmp[i]] == 1)); else { f = 0; break; } } if (f == 1) { cout << i << ' ' << j << endl; ff = 1; break; } else f = 1; if (i == 1 && j == 4) { } init(); tmp[j] = -varr[j]; tmp[k] = -varr[k]; map[i] = 1; map[j] = 1; for (int i = 1; i <= n; ++i) { if ((tmp[i] > 0 && map[tmp[i]] == 0) || (tmp[i] < 0 && map[-tmp[i]] == 1)); else { f = 0; break; } } if (f == 1) { cout << i << ' ' << j << endl; ff = 1; break; } else f = 1; } if (ff == 1) break; } if (ff == 1) break; } if (ff == 0) cout << "No Solution" << endl; system("pause"); return 0; } void init() { for (int i = 1; i <= n; ++i) { tmp[i] = varr[i]; map[i] = 0; } }