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

原题

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

C++

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

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

#include <iostream>
#include <vector>
using namespace std;

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

    vector<int> goodMan(N + 1,1);//goodMan[i]==1表示i号是好人
    int i,j;
    for ( i = 1; i <N; i++)
    {
        goodMan[i] =-1;//标记i号为狼
        for ( j = i+1; j <=N; j++)
        {
            goodMan[j] =-1;//标记j号为狼
            int liesCnt=0,wolfCnt=0;

            for (int k = 1; k <=N; ++k)
            {
                if(goodMan[abs(vec[k])]*vec[k]<0){//正负相反说明说谎
                    liesCnt++;
                    //	说谎中有一个狼人
					if( k == i || k == j )
						wolfCnt++;
                }  
            }
            if( liesCnt == 2 && wolfCnt == 1 ){
				cout << i << " " << j;
				return 0;//第一个找的解输出,保证最小序列
			}
            goodMan[j]=1;
        }     
        goodMan[i]=1;
    }
    cout << "No Solution";
	return 0;
}

柳大佬的:原始数据,狼人,说谎者各自存储,代码简洁了好多

#include <iostream>
#include <vector>
#include <cmath>
using namespace std;
int main() {
    int n;
    cin >> n;
    vector<int> v(n+1);
    for (int i = 1; i <= n; i++) cin >> v[i];
	
    for (int i = 1; i <= n; i++) {
        for (int j = i + 1; j <= n; j++) {
            vector<int> lie, a(n + 1, 1);
            a[i] = a[j] = -1;//先假设两个狼人
            for (int k = 1; k <= n; k++)
                if (v[k] * a[abs(v[k])] < 0) lie.push_back(k);//找冲突确定说谎者
            if (lie.size() == 2 && a[lie[0]] + a[lie[1]] == 0) {//满足说谎者中有一个狼人
                cout << i << " " << j;
                return 0;
            }
        }
    }
    cout << "No Solution";
    return 0;
}

方向二:
错误代码——确定说谎者找狼人

#include <iostream>
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<<s<<" ";
					else 
					cout<<"No Solution";
				}
			}
		}
		return 0;
	}
}
bool equal(int a, int b)//符号不同为1
{
	if(a==0&&b==0)return true;
	if(a<=0||b<=0) return true;
	return false;
}
posted @ 2021-11-23 17:34  Infinite_V胜  阅读(111)  评论(0)    收藏  举报