题解 | #找出直系亲属#
找出直系亲属
https://www.nowcoder.com/practice/2c958d09d29f46798696f15ae7c9703b
#include "bits/stdc++.h"
using namespace std;
class UnionSet{
public:
int us[27];
UnionSet() {
memset(us,-1, sizeof(int)*27);
}
// 子女关系返回1,非直系返回-1,询问n1是n2的谁
int find(char n1,char n2)
{
int node1=n1-'A';
int node2=n2-'A';
for (int i = node1,k=0; i>=0; i=us[i],k++) {
if (i==node2)
{
return k;
}
}
for (int i = node2,k=0; i>=0; ++k,i=us[i]) {
if (i==node1)
return -k;
}
return 0;
}
void setParent(string str)
{
int child=str[0]-'A';
int parent1=(str[1]!='-' ? str[1]-'A' : -1);
int parent2=(str[2]!='-' ? str[2]-'A' : -1);
if (parent1!=-1)
us[parent1]=child;
if (parent2!=-1)
us[parent2]=child;
}
string getRelationName(int n)
{
if (n==0)
{
return "-";
}
if (abs(n)==1)
{
return n==1 ? "parent":"child";
}
string ans= (n > 0 ? "grandparent" : "grandchild");
while (abs(n)>2)
{
ans="great-"+ans;
n>0 ? n-- : n++;
}
return ans;
}
};
int main()
{
int n,m;
while (cin>>n>>m)
{
vector<string> input(n);
UnionSet set;
for (int i = 0; i < n; ++i) {
cin>>input[i];
set.setParent(input[i]);
}
vector<string> questions(m);
for (int i = 0; i < m; ++i) {
cin>>questions[i];
}
for (string question: questions) {
cout<<set.getRelationName(set.find(question[0],question[1]))<<endl;
}
}
}
