牛客网浙江大学机试--找出直系亲属

题目: 牛客网链接

概述: 用三个字母表示出三个人的关系,并回答提出的问题。

思路: 这题采用两种方法:

  1. 采用数组解决问题
    数组用来存储子女的下标(反正是独生子女),找关系的时候就不断地搜索子女。这里分为两种情况,一种是第一个字母是第二个字母的长辈,另一个是第一个字母是第二个字母的晚辈。只要把参数顺序倒过来即可。

  2. 采用树的方法来解决问题。这里就没写粘贴的牛客网的代码。思路很清晰,很适合复习二叉树相关的知识。

数组:

#include <iostream>
#include <algorithm>
using namespace std;

int child[200];

int find_child(int a, int b, int count)
{

    if(child[a] == -1)
    {
    	return 0;
    }
    else if(child[a] == b)
    {
    	return count;
    }
    
    int temp = find_child(child[a], b, count+1);
    return temp; 
}


int main()
{
	int n, m;
	while(scanf("%d%d", &n, &m) != EOF)
	{
		
        fill(child, child+200, -1);
        
        //输入关系 
        char temp[4];
		for(int i = 0; i < n; i++)
		{
			scanf("%s", temp);
			if(temp[1] != '-') { child[(int)temp[1]] = (int)temp[0];}
			if(temp[2] != '-') { child[(int)temp[2]] = (int)temp[0];}
		}
		
		//输入查询的问题
		char ques[3];
		for(int i = 0; i < m; i++)
		{
			scanf("%s", ques);
			int flag = find_child(ques[0], ques[1], 1);
			if(flag)
			{
				if(flag == 1) printf("parent\n");
				else
				{
					for(int j = 2; j < flag; j++)
					{
						printf("great-");
					}
					printf("grandparent\n");
				}				
				continue;
			}
			flag = find_child(ques[1], ques[0], 1);
			if(flag)
			{
				if(flag == 1) printf("child\n");
				else
				{
					for(int j = 2; j < flag; j++)
					{
						printf("great-");
					}
					printf("grandchild\n");
				}			
				continue;
			}
			else
			{
				printf("-\n");
			}
		} 
			
	}
	
	return 0;
}

二叉树:

链接:https://www.nowcoder.com/questionTerminal/2c958d09d29f46798696f15ae7c9703b
来源:牛客网

#include <stdio.h>
#include <map>
#define N 26
using namespace std;
 
struct Node{//二叉树节点
    int p1;//第一个双亲的下标,-1表示不存在
    int p2;//第二个双亲的下标,-1表示不存在
}tree[N];//顺序存储,下标就是它所代表的字符编号,比如0代表'A'
 
int preOrder(int from, int to, int depth)
{//从from出发先序遍历到找到to为止,并返回to相对于from的深度
    if(from==to) return depth;
    if(tree[from].p1!=-1)
    {
        int ret=preOrder(tree[from].p1, to, depth+1);
        if(ret!=-1) return ret;
    }
    if(tree[from].p2!=-1)
    {
        int ret=preOrder(tree[from].p2, to, depth+1);
        if(ret!=-1) return ret;
    }
    return -1;
}
 
int main()
{
    int n, m;
    while(scanf("%d %d", &n, &m)!=EOF)
    {
        for(int i=0; i<N; i++)
        {
            tree[i].p1=tree[i].p2=-1;
        }
        while(n--)//构建树
        {
            char str[4];
            scanf("%s", str);
            if(str[1]!='-') tree[str[0]-'A'].p1=str[1]-'A';
            if(str[2]!='-') tree[str[0]-'A'].p2=str[2]-'A';
        }
        while(m--)//查询
        {
            char str[3];
            scanf("%s", str);
            int from=str[0]-'A';
            int to=str[1]-'A';
            int ans1=preOrder(from, to, 0);
            if(ans1==1) printf("child\n");
            else if(ans1>=2)
            {
                for(int i=ans1; i>2; i--) printf("great-");
                printf("grandchild\n");
            }
            else//看来不是晚辈,那就是长辈了
            {
                int ans2=preOrder(to, from, 0);
                 if(ans2==1) printf("parent\n");
                else if(ans2>=2)
                {
                    for(int i=ans2; i>2; i--) printf("great-");
                    printf("grandparent\n");
                }
                else printf("-\n");//也不是长辈,那就不是直系亲属
            }
        }
    }
    return 0;//大功告成
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
家谱管理系统,主要用来管理家族成员的基本信息 1、确定整个程序的功能模块。实现程序的主界面,要对主界面的功能选择输入进行容错处理。 2、实现单个结点信息的录入。 3、对录入日期信息进行合法性检验。 4、采用改变字体颜色的方式突出显示主界面的功能项。 5、计算从出生日期到死亡日期的实际天数 6、若家谱树为空,则新建家谱树。实现成员节点的添加。基本功能中可以 强制要求所有成员不同名,即不考虑同名情况(符合小家族的实际情况)。 7、添加成员节点时,可以选择将新添加的节点作为整个家谱的上一代祖先, 或者将新添加的节点作为某个现有成员的孩子。 8、作为某个现有成员的孩子,根据给出的父节点的姓名将该结点添加到相 应位置,注意,针对某一父节点,添加第一个孩子和其它孩子的区别。 9、要求在孩子兄弟二叉树中按各个孩子的年龄进行排序。 10、将家谱树保存到二进制文件。注意,不能保存空白节点。 11、从文件读入家谱信息,重建孩子兄弟二叉树形式的家谱。 12.从文件中读出所有节点信息到一个数组中,然后按一年中生日的先后进 行快速排序。 13、按姓名查询家谱成员并显示该成员的各项信息。 14、给出某一成员的姓名,删除该成员和该成员的所有子孙。 15、成员信息的修改。信息修改时要给出选择界面让用户选择需要修改的信 息项。基本功能中可以限定不容许修改父亲姓名和本人姓名。对日期信 息进行修改时要进行检验。 16、实现层次递进的方式显示整个家谱,显示结果应该体现家谱树的结构。 17、按各种关键字进行查询,要求给出关键字选择界面,并显示符合查询条 件的节点信息。 18、信息统计基本要求包括:平均身高,平均寿命,男女成员各多少,平均 家庭人口数目(假定每个成员构成一个家庭,该家庭的家庭成员是指成 员本人和他的孩子,即家庭人口数=孩子数+1)。要给出统计项的选择界 面. 19、查询某一成员的所有直系亲属。 20、给出某一成员的所有嫡系祖先。 21、确定两人关系。若两人辈分不等,则应指出甲是乙的多少代长辈(晚辈), 甲是否是乙的直系长辈(晚辈),若辈分相同,则应指出是亲兄弟还是多 少代的堂兄弟。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值