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

浙公网安备 33010602011771号