1148 Hombre lobo - Versión simple (20 punto (s))

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";
}

 

Supongo que te gusta

Origin blog.csdn.net/u012571715/article/details/114697875
Recomendado
Clasificación