题解 | #找出直系亲属#

找出直系亲属

http://www.nowcoder.com/practice/2c958d09d29f46798696f15ae7c9703b

并查集

#include <iostream>
#include <vector>
#include <string>
using namespace std;
 
void Union(vector<int>& s, int a, int b) {       //ABC 将A看作B和C的父结点
    s[b] = a;
}

int Find(vector<int>& s, int a, int b) {
    int cnt = 0;
    while (s[a] >= 0) {
        cnt++;
        if (s[a] == b) return cnt;
        a = s[a];
    }
    return 0;
}

int main()       //整个数据结构像翻转过来的二叉树
{
    int n, m;
    cin >> n;
    cin >> m;
    vector<int> s(26, -1);
    getchar();
    while (n--) {
        string str;
        getline(cin, str);
        if (str[1] != '-') Union(s, str[0] - 'A', str[1] - 'A');
        if (str[2] != '-') Union(s, str[0] - 'A', str[2] - 'A');        
    }
    while (m--) {
        string str;
        getline(cin, str);
        int cnt1 = Find(s, str[0] - 'A', str[1] - 'A');
        if (cnt1 > 0) {
            if (cnt1 == 1) {
                cout << "parent" << endl;
                continue;
            }
            if (cnt1 == 2) {
                cout << "grandparent" << endl;
                continue;
            }
            string res = "grandparent";
            cnt1 = cnt1 - 2;
            while (cnt1--) {
                res = "great-" + res;
            }
            cout << res << endl;
            continue;
        }
        int cnt2 = Find(s, str[1] - 'A', str[0] - 'A');
        if (cnt2 > 0) {
            if (cnt2 == 1) {
                cout << "child" << endl;
                continue;
            }
            if (cnt2 == 2) {
                cout << "grandchild" << endl;
                continue;
            }
            string res = "grandchild";
            cnt2 = cnt2 - 2;
            while (cnt2--) {
                res = "great-" + res;
            }
            cout << res << endl;
            continue;
        }
        if (cnt1 == 0 && cnt2 == 0) cout << "-" << endl;
    }
    return 0;
}
全部评论

相关推荐

11-27 17:35
已编辑
蚌埠坦克学院 C++
深信服 后台开发 n×12
点赞 评论 收藏
分享
11-03 14:38
重庆大学 Java
AAA求offer教程:我手都抬起来了又揣裤兜了
点赞 评论 收藏
分享
11-27 12:36
已编辑
门头沟学院 前端工程师
Apries:这个阶段来说,很厉害很厉害了,不过写的简历确实不是很行,优势删掉吧,其他的还行
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务