1089 狼人杀-简单版 (20 分)


原题

https://pintia.cn/problem-sets/994805260223102976/problems/1038429385296453632

C++

转载参考 https://www.bilibili.com/read/cv11426576/
其实还是没懂。若满足说谎人数=2,说谎中的狼人=1,即为找到了一个结果(不需要你再去找另一个说谎者是谁

关键是先确定狼人找说谎者——由冲突计算说谎者数量

#include 
#include 
using namespace std;

int main(void)
{
    int N;
    cin >> N;
    vector vec(N + 1);
    for(int i = 1; i <= N; i++){
        cin>>vec[i];
    }

    vector goodMan(N + 1,1);//goodMan[i]==1表示i号是好人
    int i,j;
    for ( i = 1; i 

错误代码——确定说谎者找狼人

#include 
using namespace std;

bool equal(int a, int b);
int main()
{
	int num = 0;
	cin >> num;
	int result[101];
	int jugde[101] = {0};
	for (int i = 1; i <= num; i++)
	{
		int option;
		cin >> option;
		result[i] = option;
	}
	int i, j;
	for (i = 1; i <= num; i++)
	{
		for (j = i + 1; j <= num; j++)
		{ //说谎人编号i j
			bool flag = true;
			for (int s = 1; s <= num; s++)
			{
				jugde[s] = 0;
			}

			jugde[abs(result[i])] = result[i] * (-1);
			jugde[abs(result[j])] = result[j] * (-1);

			for (int k = 1; k <= num; k++)
			{
				if (k != i && k != j)
				{
					if (jugde[k] == 0)
					{
						jugde[abs(result[k])] = result[k];
					}
					else if (jugde[abs(result[k])] * result[k] < 0) //不等
					{
						flag = false;
						break;
					}
					else
						jugde[abs(result[k])] = result[k];
				}
			}
			if (flag && equal(jugde[i], jugde[j])) //不冲突并且说谎人中有一个狼人
			{
				int count=0;
				for (int s = 1; s <= num; s++)
				{
					// cout << s << "*";
					if (jugde[s] <= 0)
					count++;
				}
				for (int s = 1; s <= num; s++)
				{
					// cout << s << "*";
					if (count==2&&jugde[s] <= 0)
					cout<