乐鑫科技2021提前批软件类笔试题

```自己写的蛮烂,将就看看,给个建议啥的最好了

// 乐鑫科技2021提前批软件类笔试
// 题目大意:构建家族树,输出两个家族成员的辈分,亲属关系,其中亲属关系,父子为1.兄弟为2
// 输入:第一行:三个整型,家族成员数量,成员1,成员2
// 之后按家族成员数量输入  父亲,子女

// 输出:辈分差,亲属关系

// 例如;
// 15 7 2                                                         0
// 0 1                                                      1            2
// 0 2      ========》》                                  3     4     5       6 
// 1 3                                                   7  8  9 10   11 12 13 14 
// 1 4
// 2 5
// 2 6    
// 3 7
// 3 8
// 4 9
// 4 10
// 5 11
// 5 12 
// 6 13
// 6 14
// 输出:-2 4
#include <iostream>
#include <vector>

using namespace std ;

struct person
{
    public:
        int name;
        person *firChild;
        person *secChild;
        person *Father;
};
person* create_person(int m_nanme,person *m_father){
    person *m_person = (person *)malloc(sizeof(person));
    m_person ->name = m_nanme;
    m_person ->firChild =   NULL;
    m_person ->secChild =   NULL;
    m_person ->Father   =   m_father;
    return m_person;
}
person* find(person *m_root,int m_name){
    person *m_person =NULL;
    if(m_root == NULL) return NULL;
    if(m_root ->name == m_name) return m_root;
    if(m_person = find(m_root->firChild,m_name)) return m_person;
    return find(m_root->secChild,m_name);
}
// bool  family_has_person(person *m_root,int m_name){
//     if(find(m_root, m_name)!=NULL) return true ;
//     else    return false; 
// }
person* create_famliy_tree(int m_generation){
    person *m_root = NULL;//根节点
    // person *m_root =(person *)malloc(sizeof(person));
    person *m_father = NULL;
    person *m_child = NULL;
    int m_father_name,m_child_name;
    for (int i = 0; i < m_generation-1; i++)
        {
            cin>>m_father_name >>m_child_name;
            if (m_root == NULL ){
                m_root =(person *)malloc(sizeof(person));
                m_root ->name = m_father_name;
                printf("加入成员%d\n",m_father_name);
                m_child = create_person(m_child_name,m_root);
                m_root ->firChild = m_child;
                m_root ->secChild = NULL;
                m_root ->Father   = NULL;
                printf("加入成员%d\n",m_child_name);
            }else if(m_father = find(m_root,m_father_name)){
                if(m_father->firChild ==NULL ){
                    m_child = create_person(m_child_name,m_father);
                    m_father ->firChild = m_child;
                    printf("加入成员%d\n",m_child_name);
                }else if(m_father->secChild == NULL){
                    m_child = create_person(m_child_name,m_father);
                    m_father ->secChild = m_child;
                    printf("加入成员%d\n",m_child_name);
                }else{
                    printf("此父亲已有两个孩子\n");
                    i--;
                }                
            }else{
                printf("家族中不存在此成员\n");
                i--;
            }       
        }
    return m_root;
}
vector<int> find_path_to_root(person *m_person){
    vector<int> path_to_root;
    person *m_person_point = m_person;
    while (m_person_point != NULL)
    {
        path_to_root.push_back(m_person_point ->name);
        m_person_point = m_person_point ->Father;
    }
    return path_to_root;
}
int find_same_parent(vector<int>path1,vector<int>path2){
    for (int i = 0; i < path1.size(); i++)
    {
        int person_name = path1[i];
        for(int j =0 ; j < path2.size();j++){
            if(person_name == path2[j]) return person_name;
        }
    }
    
}
int generation_to_sameparent(vector<int> m_vec, int m_name){
    for (int i = 0; i < m_vec.size(); i++)
    {
        if(m_vec[i] == m_name ) return i;
    }
}
int main(){
    int generation,person1_name,person2_name;
    cin >>generation>>person1_name>>person2_name;    
    person *root = create_famliy_tree(generation);
    printf("生成家族树\n"); 
    if(find(root,person1_name) !=NULL &&find(root,person2_name) != NULL){
        printf("两人均存在\n");
        person *person1 = find(root,person1_name);
        person *person2 = find(root,person2_name); 
        vector<int> person1_to_root,person2_to_root;
        person1_to_root = find_path_to_root(person1);
        person2_to_root = find_path_to_root(person2);
        int person1_generation =person1_to_root.size();
        int person2_generation =person2_to_root.size();
        int same_parent_name = find_same_parent(person1_to_root,person2_to_root); 
        int generation_to_same_parent =generation_to_sameparent(person1_to_root,same_parent_name);
        printf("%d ,%d",person2_generation-person1_generation,person1_generation+person2_generation-2-2*(person1_generation-1-generation_to_same_parent));
    }else{
        printf("家族中不存在此人\n");
    }   
}
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值