題目
思路
二重循環假設兩個狼人,判斷說謊人數,如果恰好爲2並且一個是狼人一個是平民,則輸出,若找不到則輸出No Solution
代碼
#include <iostream>
#include <vector>
#include <set>
using namespace std;
vector<int> vec;
int main()
{
int n;
cin >> n;
vec.resize(n + 1);
vector<int> mark;
mark.resize(n + 1);
fill(mark.begin(), mark.end(), 1);
for (int i = 1; i <= n; ++i) cin >> vec[i];
for (int i = 1; i <= n-1; ++i) {
for (int j = i + 1; j <= n; ++j) {
mark[i] = -mark[i];
mark[j] = -mark[j];
set<int> v;
for(int k = 1; k <= n; ++k) {
if (vec[k] * mark[abs(vec[k])] < 0)
v.emplace(k);
}
if (v.size() == 2 && ((v.find(i) == v.end() && v.find(j) != v.end()) || (v.find(j) == v.end() && v.find(i) != v.end()))) {
cout << i << " " << j;
return 0;
}
mark[i] = -mark[i];
mark[j] = -mark[j];
}
}
cout << "No Solution";
return 0;
}