题解 | #找出直系亲属#
找出直系亲属
https://www.nowcoder.com/practice/2c958d09d29f46798696f15ae7c9703b
#include<cstdio>
#include<iostream>
#include<utility>
#include<map>
// 采用并查集思想,用son数组记录自己儿子结点
using namespace std;
const int MAXN = 51;
int son[MAXN];
int height[MAXN];
void initial(){
for(int i=0;i<MAXN;++i)
son[i] = i;
}
int find(int x, int y) {
int ans = 0;
while(son[x] != x){
if(son[x] == y) {
++ans;
break;
}
else {
++ans;
x = son[x];
}
}
if(son[x] == x)
return 0;
return ans;
}
int main(){
initial();
int n,m;
scanf("%d %d\n", &n, &m);
char a,b,c;
while(n--){
scanf("%c%c%c\n", &a, &b, &c);
son[b-'A'] = a-'A';
son[c-'A'] = a-'A';
}
while(m--) {
scanf("%c%c\n", &a, &b);
// a 是 b 的什么?
int ans = find(a-'A', b-'A');
// 如果ans==0,那么说明a不是b的祖先。
if(ans == 0) {
ans = find(b-'A', a-'A');
// ans == 0,说明b也不是a的祖先。说明二者没关系。
if(ans == 0) {
printf("-\n");
}else{
if(ans==1)
printf("child\n");
else if(ans >= 2) {
for(int i=0;i<ans-2;++i)
printf("great-");
printf("grandchild\n");
}
}
}
else {
if(ans == 1)
printf("parent\n");
else if(ans >= 2) {
for(int i=0;i<ans-2;++i)
printf("great-");
printf("grandparent\n");
}
}
}
return 0;
}