代码
#include <iostream>
#include <sstream>
using namespace std;
int strToInt(string s){
stringstream ss;
ss<<s;
int a;
ss>>a;
return a;
}
int main() {
int n;
cin>>n;
string s[n+1];
for(int i=1; i<=n; i++){
cin>>s[i];
}
for(int i=1; i<=n; i++){
for(int j=i+1; j<=n; j++){
int person[n+1];
for(int k=1; k<=n; k++){
if(k==i || k==j){
person[k] = 1;
}
else{
person[k] = 0;
}
}
int count = 0;
int ans[n+1] = {0};
for(int k=1; k<=n; k++){
int num = strToInt(s[k].substr(1));
if((s[k].at(0)=='-' && !person[num])
|| (s[k].at(0)=='+' && person[num])){
count++;
ans[k] = 1;
}
}
if(count==2){
if((ans[i]==1 && ans[j]==0)
|| (ans[i]==0 && ans[j]==1)){
cout<<i<<" "<<j<<endl;
return 0;
}
}
}
}
cout<<"No Solution"<<endl;
return 0;
}
注解
1、用字符串代表用户输入,将字符串分解成符号位和数值位两部分。
2、用数组代表用户是狼人还是好人,1代表狼人,0代表好人。
3、题目要求是,unique的时候输出狼人编号最小的,因此在循环时将按照狼人由小到大的顺序循环,找到一组就输出结果然后return结束程序。
4、关键点:有两人说谎,有狼人说谎且不是所有狼人都说话。关键就是这两句话的翻译。把这两句话用代码翻译好了,基本就没问题了。