PAT---A1048 Werewolf - Simple Version (20分)

本文解析了一道关于狼人杀游戏的逻辑判断题,题目要求找出两个狼人,并且确定唯一说谎者。通过枚举所有可能情况,最终找到符合题设条件的解。文章提供了详细的解题思路和C++代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题意

狼人杀,给出n个玩家的断言(即认定某人是狼人或者人类),狼人总共有两个,而且恰好有1个狼和一个人类撒了谎。如果有多个答案就输出”最小“的那个。此题是20分的题,但是第一次看到的时候还是非常懵不知道如何下手,所以记录一下。

思路

此题其实就是简单的枚举题。枚举每一种情形,如果符合条件就是答案了。由于是多个答案选择 ”最小“的那个,就按照从小到大的顺序枚举就行了。

Sample Input:

5
-2
+3
-4
+5
+4

Sample Output:

1 4
#include "bits/stdc++.h"
using namespace std;
int main(){
//     freopen("input.txt","r",stdin);
    int n; cin >> n;
    int assets[n+1]; // true: wolf
    for (int i = 1; i <= n; ++i) scanf("%d",&assets[i]);
    for (int i = 1; i < n; ++i) {
        for (int j = i+1; j <= n; ++j) { // suppose that i and j are wolf
            int lair_human = 0; int lair_wolf = 0;
            for(int k = 1; k <= n; k++){ // for all players
                if (lair_human > 1 || lair_wolf > 1) break;
                bool lied = false;

                int t = assets[k];
                // saying k is wolf, but not.
                if (t < 0 && abs(t) != i && abs(t) != j) lied = true;
                // saying k is human but not.
                if (t > 0 && (t==i || t==j)) lied = true;

                if (lied) {
                    if (k == i || k == j) lair_wolf ++;
                    else lair_human ++;
                }
            }
            if (lair_human == 1 && lair_wolf == 1){
                cout << i << " " << j << endl;
                return 0;
            }
        }
    }
    cout << "No Solution" << endl;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值