PROGRAMMING TEACHING ASSISTANT:Problem 1089
Solution(verified):
- 已知 N 名玩家中有 2 人扮演狼人角色,有 2
人说的不是实话,有狼人撒谎但并不是所有狼人都在撒谎。要求你找出扮演狼人角色的是哪几号玩家?
——》
说谎话的人(liar):一个是狼人(wolf);一个是好人(man)
- 如果有解,在一行中按递增顺序输出 2 个狼人的编号,其间以空格分隔,行首尾不得有多余空格。如果解不唯一,则输出最小序列解 ——
即对于两个序列 A=a[1],…,a[M] 和 B=b[1],…,b[M],若存在 0≤k<M 使得 a[i]=b[i]
(i≤k),且 a[k+1]<b[k+1],则称序列 A 小于序列 B。若无解则输出 No Solution
——》用一个数组tell[ ] 来存放每一位玩家所说的话,数组的大小是N。“用正号表示好人,负号表示狼人”。依据输出需要:“输出最小序列解 ”,假设两个狼人的序号分别是:
(1,2)(1,3)(1,4),……(1,N-1)
(2,3)(2,4)(2,5),……(2,N-1)
……
(N-2,N-1)
在这个遍历过程中通过function: if_conjecture_is_true() 判断猜想是否成立。如果成立,那么输出题目所要求的结果。如果便利结束没有符合条件的结果,那么就无解,则输出“No solution”.
猜想判断过程中有以下几种情况与题目条件不符,可以直接continue,进入下一个循环:
- 说假话的人(liar) ! = 2 ;
- 猜想(conjecture)中的两个狼人(wolf)都说了假话
- 猜想(conjecture)中的两个狼人(wolf)都说了真话
(只有猜想 conjecture 中的两个狼人 一个说了真话,另一个说了假话,并且 liar ==2 才是符合条件的)
AC CODE:
#include <iostream>
#include <cstdio>
#include <vector>
#include <cmath>
using namespace std;
bool conjecture_is_true(vector <int> &tell,int &wolf_first,int &wolf_second){