Werewolf(狼人杀) is a game in which the players are partitioned into two parties: the werewolves and the human beings. Suppose that in a game,

  • player #1 said: "Player #2 is a werewolf.";
  • player #2 said: "Player #3 is a human.";
  • player #3 said: "Player #4 is a werewolf.";
  • player #4 said: "Player #5 is a human."; and
  • player #5 said: "Player #4 is a human.".

Given that there were 2 werewolves among them, at least one but not all the werewolves were lying, and there were exactly 2 liars. Can you point out the werewolves?

Now you are asked to solve a harder version of this problem: given that there were N players, with 2 werewolves among them, at least one but not all the werewolves were lying, and there were exactly 2 liars. You are supposed to point out the werewolves.

Input Specification:

Each input file contains one test case. For each case, the first line gives a positive integer N (5). Then N lines follow and the i-th line gives the statement of the i-th player (1), which is represented by the index of the player with a positive sign for a human and a negative sign for a werewolf.

Output Specification:

If a solution exists, print in a line in ascending order the indices of the two werewolves. The numbers must be separated by exactly one space with no extra spaces at the beginning or the end of the line. If there are more than one solution, you must output the smallest solution sequence -- that is, for two sequences [ and [, if there exists 0 such that [ (i≤k) and [, then A is said to be smaller than B. In case there is no solution, simply print No Solution.

Sample Input 1:

5
-2
+3
-4
+5
+4
 

Sample Output 1:

1 4
 

Sample Input 2:

6
+6
+3
+1
-5
-2
+4
 

Sample Output 2 (the solution is not unique):

1 5
 

Sample Input 3:

5
-2
-3
-4
-5
-1
 

Sample Output 3:

No Solution

题意:

  有N个人,这里面有两只是狼人,一只狼人说真话,另一只狼人说假话,另外还有一个人类说假话,判断那两个人是狼人。

思路:

  看大佬写的吧~

Code:

#include<iostream>
#include<vector>
#include<cmath>
#include<set>
#include<algorithm> using namespace std; bool cmp(pair<int, int> a, pair<int, int> b) {
if (a.first == b.first) {
return a.second < b.second;
} else {
return a.first < b.first;
}
} int main() {
int n, t;
cin >> n; set<int> human;
set<int> werewolf;
vector<int> said(n+1, 0);
vector<pair<int, int> > twoWereWolf; for (int i = 1; i <= n; ++i) {
cin >> t;
said[i] = t;
} bool wrong = false;
int werewolf1, werewolf2;
bool foundWerewolf1 = false;
bool foundWerewolf2 = false;
for (int i = 1; i <= n; ++i) {
for (int j = 1; j <= n; ++j) {
if (j == i) continue;
werewolf1 = -1;
werewolf2 = -1;
wrong = false;
foundWerewolf1 = false;
foundWerewolf2 = false;
human.clear();
werewolf.clear();
for (int k = 1; k <= n; ++k) {
if (k != i && k != j) {
if (said[k] < 0)
werewolf.insert(abs(said[k]));
else
human.insert(said[k]);
}
}
for (int h : human) {
if (h == i) {
werewolf1 = j;
foundWerewolf1 = true;
}
if (h == j) {
werewolf1 = i;
foundWerewolf1 = true;
}
}
for (int w : werewolf) {
if (w != werewolf1) {
werewolf2 = w;
foundWerewolf2 = true;
}
}
if (foundWerewolf1 && foundWerewolf2) {
if (human.find(foundWerewolf1) == human.end() && human.find(foundWerewolf2) == human.end())
if (werewolf.find(werewolf1) != werewolf.end() || werewolf.find(werewolf2) != werewolf.end())
twoWereWolf.push_back({werewolf1, werewolf2});
}
}
} sort(twoWereWolf.begin(), twoWereWolf.end(), cmp); if (twoWereWolf.size() > 0) {
cout << twoWereWolf[0].first << " " << twoWereWolf[0].second << endl;
} else {
cout << "No Solution" << endl;
} return 0;
}

记得上上次考试的时候我没有做出来这道题,今天又做了一下,只通过了两组样例。


大佬的代码:https://www.liuchuo.net/archives/6494

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

1148 Werewolf - Simple Version的更多相关文章

  1. PAT 1148 Werewolf - Simple Version

    1148 Werewolf - Simple Version (20 分)   Werewolf(狼人杀) is a game in which the players are partitioned ...

  2. PAT 1148 Werewolf - Simple Version [难理解]

    1148 Werewolf - Simple Version (20 分) Werewolf(狼人杀) is a game in which the players are partitioned i ...

  3. PAT(A) 1148 Werewolf - Simple Version(Java)逻辑推理

    题目链接:1148 Werewolf - Simple Version (20 point(s)) Description Werewolf(狼人杀) is a game in which the p ...

  4. 1148 Werewolf - Simple Version (20 分)

    Werewolf(狼人杀) is a game in which the players are partitioned into two parties: the werewolves and th ...

  5. PAT_A1148#Werewolf - Simple Version

    Source: PAT 1148 Werewolf - Simple Version (20 分) Description: Werewolf(狼人杀) is a game in which the ...

  6. PAT A1148 Werewolf - Simple Version (20 分)——暴力遍历,负负得正

    Werewolf(狼人杀) is a game in which the players are partitioned into two parties: the werewolves and th ...

  7. [Functional Programming] Write a simple version of Maybe

    Maybe has two types: Just / Nothing. Just() will just return the value that passed in. Nothing retur ...

  8. PAT 2018 秋

    A 1148 Werewolf - Simple Version 思路比较直接:模拟就行.因为需要序列号最小的两个狼人,所以以狼人为因变量进行模拟. #include <cstdio> # ...

  9. 2018.9.8pat秋季甲级考试

    第一次参加pat考试,结果很惨,只做了中间两道题,还有一个测试点错误,所以最终只得了不到50分.题目是甲级练习题的1148-1151. 考试时有些紧张,第一题第二题开始测试样例都运行不正确,但是调试程 ...

随机推荐

  1. vue-axios插件、django-cors插件、及vue如何使用第三方前端样式库:element/jQuery/bootstrap

    目录 一.vue的ajax插件:axios 1.安装axios 2.axios参数 二.CORS跨域问题(同源策略) 1.Django解决CORS跨域问题方法 三.前端请求携带参数及Django后台如 ...

  2. 【译】Rust宏:教程与示例(一)

    原文标题:Macros in Rust: A tutorial with examples 原文链接:https://blog.logrocket.com/macros-in-rust-a-tutor ...

  3. vuex中辅助函数的使用方法

    mapState import { mapState } from 'vuex' export default { // ... computed:{ ...mapState({ // 箭头函数可使代 ...

  4. 使用ASP.NET Blazor Server 写混合桌面程序的疯狂想法

    开发本地桌面程序,使用进程内浏览器+进程内BLAZOR服务器,然后任性写功能,自由分发,放飞自我,大家看怎么样? 求评估,求批评 https://github.com/congzhangzh/desk ...

  5. C#中的字段与属性的区别及属性的作用

    C#中的字段与属性的区别及属性的作用 先上代码 public class Employee { //字段 private string name; //属性 public string Name { ...

  6. 【RocketMQ源码分析】深入消息存储(1)

    最近在学习RocketMQ相关的东西,在学习之余沉淀几篇笔记. RocketMQ有很多值得关注的设计点,消息发送.消息消费.路由中心NameServer.消息过滤.消息存储.主从同步.事务消息等等. ...

  7. JavaScript快速上手

    引入JavaScript项目 在html中 <!DOCTYPE html> <html lang="en"> <head> <meta c ...

  8. FreeBSD WIFI 配置详细介绍

    首先运行ifconfig,看看能不能找到你的网卡,如果能,那么你可以走了﹉﹉﹉﹉﹉﹉﹉﹉﹉﹉﹉﹉﹉﹉﹉﹉﹉﹉﹉﹉运行sysctl net.wlan.devices,他可以告诉你,找到的无线网卡编辑/b ...

  9. php-fpm的慢执行日志

    通过慢执行日志,我们可以清晰地了解PHP脚本在哪里执行时间长,可以定位到行 下面介绍如何开启和查看慢执行日志 #vim /usr/local/php-fpm/etc/php-fpm.d/www.con ...

  10. 仿MSDN的帮助系统

    作为软件开发人员,软件做好后,接下来就是编写文档.我自己也是做软件的,经常有用户询问软件的安装与使用, 我一直很喜欢微软的MSDN帮助系统,简介.大气,使用方便. 网上也找了很久,感觉一直没有合适的, ...