0
点赞
收藏
分享

微信扫一扫

B1089 狼人杀-简单版 (20 分| 简单模拟,附详细注释,逻辑分析)


写在前面

  • 参考思路
  • 输入数字保存在v容器数组
  • i从1~n、j从i+1~n遍历,分别假设i和j是狼人
  • a数组表示该人是狼人还是好人,等于1表示是好人,等于-1表示是狼人。
  • k从1~n分别判断k所说的话是真是假,​​v[k] * a[abs(v[k])] < 0​
  • 说谎,则将k放在lie数组中
  • 遍历完成后判断lie数组,如果说谎人数等于2并且这两个说谎的人1个好人1个狼人​​a[lie[0]] + a[lie[1]] == 0​​(即)表示满足题意,输出i和j并return
  • 否则最后的时候输出No Solution~

测试用例

input:
5
-2
+3
-4
+5
+4
output:
1 4

input:
6
+6
+3
+1
-5
-2
+4
output:
1 5

input:
5
-2
-3
-4
-5
-1
output:

ac代码

#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];
/* 假设i和j是狼人 */
for(int i=1; i<=n; i++)
{
for(int j=i+1; j<=n; j++)
{
/* a数组表示该人是狼人还是好人,等于1表示是好人,等于-1表示是狼人 */
vector<int> lie, a(n+1,1);
a[i] = a[j] = -1;
/* k从1~n分别判断k所说的话是真是假 */
for(int k=1; k<=n; k++)
if(v[k]*a[abs(v[k])]<0) lie.push_back(k);
/* 说谎人数等于2并且1个好人1个狼人,表示满足题意,输出i和j编号 */
if(lie.size()==2 && a[lie[0]] + a[lie[1]]== 0)
{
cout << i << " " << j;
return 0;
}
}
}
cout << "No Solution";
return 0;
}


举报

相关推荐

1089 狼人杀-简单版

0 条评论