题解 | #找出直系亲属#

找出直系亲属

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

全部评论

相关推荐

点赞 评论 收藏
分享
程序员牛肉:主要是因为小厂的资金本来就很吃紧,所以更喜欢有实习经历的同学。来了就能上手。 而大厂因为钱多,实习生一天三四百的就不算事。所以愿意培养你,在面试的时候也就不在乎你有没有实习(除非是同级别大厂的实习。) 按照你的简历来看,同质化太严重了。项目也很烂大街。 要么换项目,要么考研。 你现在选择工作的话,前景不是很好了。
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务