Ideas:
Agrietamiento por fuerza bruta, verificar que la combinación {(i, j) | 1 <= i <j <= N}, si cumple con las condiciones dadas:
1 hombre lobo mintió, los otros hombres lobo no mintieron y 1 plebeyo mintió (al menos uno, pero no todos, los hombres lobo mentían)
La combinación (i, j) es la solución, y si no hay solución, no hay solución.
1148 Hombre lobo - Versión simple (20 punto (s))
Werewolf (狼人 杀) es un juego en el que los jugadores se dividen en dos partes: los hombres lobo y los seres humanos. Supongamos que en un juego,
- el jugador n. ° 1 dijo: "El jugador n. ° 2 es un hombre lobo";
- el jugador n. ° 2 dijo: "El jugador n. ° 3 es un humano";
- el jugador n. ° 3 dijo: "El jugador n. ° 4 es un hombre lobo";
- el jugador n. ° 4 dijo: "El jugador n. ° 5 es un humano"; y
- el jugador n. ° 5 dijo: "El jugador n. ° 4 es un humano".
Dado que había 2 hombres lobo entre ellos, al menos uno, pero no todos, mentían, y había exactamente 2 mentirosos. ¿Puedes señalar a los hombres lobo?
Ahora se le pide que resuelva una versión más difícil de este problema: dado que había N jugadores, con 2 hombres lobo entre ellos, al menos uno, pero no todos, mentían, y había exactamente 2 mentirosos. Se supone que debes señalar a los hombres lobo.
Ejemplo:
#include<iostream>
#include<cmath>
#include<vector>
#include<set>
using namespace std;
int main()
{
int N;
cin >> N;
vector<int> player(N+1);
for(int i = 1; i <= N; i++) cin >> player[i];
vector<int> real(N+1, 1);
for(int i = 1; i <= N-1; i++) {
real[i] = -1;
for(int j = i+1; j <= N; j++) {
set<int> lies;
lies.clear();
real[j] = -1;
for(int k = 1; k <= N; k++)
if(real[abs(player[k])] * player[k] < 0) lies.insert(k);
if(lies.size() == 2 && (lies.count(i) + lies.count(j) == 1)) {
cout << i << ' ' << j;
return 0;
}
real[j] = 1;
}
real[i] = 1;
}
cout << "No Solution";
}