費解啊。
"所謂“五代以內無公共祖先”是指兩人的公共祖先(如果存在的話)必須比任何一方的曾祖父輩分高。"
也就是這個祖先出現在任意一方的五代中,都認為是近親。
只有他是A的五代之外並且是B的五代之外,才認為不是近親。
#include <bits/stdc++.h>
using namespace std;
map<string, pair<int, string>> mp;
bool check(string a,string b) {
map<string, int> ss;//名字,第幾代
int count = 1;
while (a.size()) {
ss[a] = count;
a = mp[a].second;
count++;
}
int count2 = 1;
while (b.size()) {
if (ss.count(b)) {//如果在a中找到了b
if (ss[b] < 5 || count2 < 5) return false;//只要在一方當中屬於近親那麼就是近親
else return true;//不是近親
}
b = mp[b].second;
count2++;
}
return true;//不是近親
}
int main() {
int n;
cin >> n;
for (int i = 0; i < n; i++) {
string sname, fname;
cin >> sname >> fname;
int len = fname.size();
if (fname[len - 1] == 'm') {
mp[sname].first = 1;//男孩
}
else if (fname[len - 1] == 'f') {
mp[sname].first = -1;//女孩
}
else {
int pos = fname.find("sson");
if (pos != -1) {
string s = fname.substr(0, pos);
mp[sname] = { 1,s };//男孩
}
pos = fname.find("sdottir");
if (pos != -1) {
string s = fname.substr(0, pos);
mp[sname] = { -1,s };//女孩
}
}
}
int t;
cin >> t;
for (int i = 0; i < t; i++) {
string a, b, c, d;
cin >> a >> b >> c >> d;//a和c是有用的
if (mp.count(a) && mp.count(c)) {
int sex1 = mp[a].first;
int sex2 = mp[c].first;
if (sex1 == sex2) {
cout << "Whatever" << '\n';
continue;
}
}
if (!mp.count(a) || !mp.count(c)) {
cout << "NA" << '\n';
continue;
}
int isok = check(a, c);
if (isok) cout << "Yes" << '\n';
else cout << "No" << '\n';
}
return 0;
}
參考部落格: https://blog.csdn.net/hys__handsome/article/details/124484080