数据量小,直接暴力求解
#include<cstdio>
#include<vector>
using namespace std;
#define maxn 110
bool check(int ptype[], int sta[], int i, bool lie) { // 检查当前位置的说法是否符合当前假设
int statement = sta[i];
if (lie) statement = -statement;
if (statement < 0 && ptype[-statement] < 0) return true;
if (statement > 0 && ptype[statement] == 0) return true;
else return false;
}
int main(){
int N;
int sta[maxn];
scanf("%d", &N);
for (int i = 1; i <= N; i++) {
scanf("%d", &sta[i]);
}
for (int w1 = 1; w1 < N; w1++) { // 假设第一个狼人
for (int w2 = w1 + 1; w2 <= N; w2++) { // 假设第二个狼人
int ptype[maxn] = {0}; // 用数组记录人的种类,people type
ptype[w1] = ptype[w2] = -1;
int l1 = w1; // 假设第一个狼人撒谎
for (int l2 = 1; l2 <= N; l2++) {
if (l2 == w1 || l2 == w2) continue;
int i;
for (i = 1; i <= N; i++) {
if (i == l1 || i == l2) {
bool lie = true;
if(!check(ptype, sta, i, lie)) break;
}
else {
bool lie = false;
if(!check(ptype, sta, i, lie)) break;
}
}
if (i == N + 1) {
printf("%d %d", w1, w2);
return 0;
}
}
l1 = w2; // 假设第二个狼人撒谎
for (int l2 = 1; l2 <= N; l2++) {
if (l2 == w1 || l2 == w2) continue;
int i;
for (i = 1; i <= N; i++) {
if (i == l1 || i == l2) {
bool lie = true;
if(!check(ptype, sta, i, lie)) break;
}
else {
bool lie = false;
if(!check(ptype, sta, i, lie)) break;
}
}
if (i == N + 1) {
printf("%d %d", w1, w2);
return 0;
}
}
}
}
printf("No Solution\n");
}