题解 | #找出直系亲属#

找出直系亲属

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

全部评论

相关推荐

哇哇的菜鸡oc:他这不叫校招offer,而是实习offer
点赞 评论 收藏
分享
27届毕业,最近想找一段大厂实习,感觉简历有些问题,好多都不给面,求大佬们指点,最近好焦虑
重生之我学Java干...:我从后端的角度分析一下你的第一个项目,我感觉亮点不是很突出。因为我是因为组内有需求,临时上手学react干活。我用到的技术基本就cover你那个智慧园区管理平台的很多亮点了。那作为比较专业的前端,你上述的内容是不是有点单薄呢。感觉还得包装
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务