PTA7-2 愿天下有情人都是失散多年的兄妹
阅读原文时间:2023年07月10日阅读:2

呵呵。大家都知道五服以内不得通婚,即两个人最近的共同祖先如果在五代以内(即本人、父母、祖父母、曾祖父母、高祖父母)则不可通婚。本题就请你帮助一对有情人判断一下,他们究竟是否可以成婚?

输入第一行给出一个正整数N(2 ≤ N ≤10^4​​),随后N行,每行按以下格式给出一个人的信息:

本人ID 性别 父亲ID 母亲ID

其中ID是5位数字,每人不同;性别M代表男性、F代表女性。如果某人的父亲或母亲已经不可考,则相应的ID位置上标记为-1。

接下来给出一个正整数K,随后K行,每行给出一对有情人的ID,其间以空格分隔。

注意:题目保证两个人是同辈,每人只有一个性别,并且血缘关系网中没有乱伦或隔辈成婚的情况。

对每一对有情人,判断他们的关系是否可以通婚:如果两人是同性,输出Never Mind;如果是异性并且关系出了五服,输出Yes;如果异性关系未出五服,输出No

24
00001 M 01111 -1
00002 F 02222 03333
00003 M 02222 03333
00004 F 04444 03333
00005 M 04444 05555
00006 F 04444 05555
00007 F 06666 07777
00008 M 06666 07777
00009 M 00001 00002
00010 M 00003 00006
00011 F 00005 00007
00012 F 00008 08888
00013 F 00009 00011
00014 M 00010 09999
00015 M 00010 09999
00016 M 10000 00012
00017 F -1 00012
00018 F 11000 00013
00019 F 11100 00018
00020 F 00015 11110
00021 M 11100 00020
00022 M 00016 -1
00023 M 10012 00017
00024 M 00022 10013
9
00021 00024
00019 00024
00011 00012
00022 00018
00001 00004
00013 00016
00017 00015
00019 00021
00010 00011


Never Mind
Yes
Never Mind
No
Yes
No
Yes
No
No

创建一个储存性别以及父母序数的结构体,通过递归的函数来查找五代之内是否有相同的亲属。

结构体里代表父母序数的数字要初始化为-1,且要赋上性别。

#include<stdio.h>
#include<string.h>
struct btnode{
    char fm;
    int left,right;
}bt[100005];
int find(int a,int b,int i){
    if(a==-1||b==-1)return 1;
    if(bt[a].left!=-1&&bt[a].left==bt[b].left)return 0;
    if(bt[a].right!=-1&&bt[a].right==bt[b].right)return 0;

    i++;
    if(i>=4)return 1;
    return(find(bt[a].left,bt[b].left,i)&&find(bt[a].left,bt[b].right,i)&&find(bt[a].right,bt[b].left,i)&&find(bt[a].right,bt[b].right,i));
}//查找五代之内是否有相同亲属,难点!
int main()
{
    int N,i,num,fid,mid,K,a,b;
    char fm;
    scanf("%d",&N);
    for(i=0;i<N;i++)
    {
        scanf("%d %c %d %d",&num,&fm,&fid,&mid);
        bt[num].fm=fm;
        bt[fid].fm='M';
        if(!bt[fid].left)bt[fid].left=-1;
        if(!bt[fid].right)bt[fid].right=-1;
        bt[num].left=fid;
        bt[mid].fm='F';
        if(!bt[mid].left)bt[mid].left=-1;
        if(!bt[mid].right)bt[mid].right=-1;
        bt[num].right=mid;
    }//为所需的结构体赋值以及初始化
    scanf("%d",&K);
    for(i=0;i<K;i++)
    {
        scanf("%d%d",&a,&b);
        if(bt[a].fm==bt[b].fm){
            printf("Never Mind\n");
            continue;
        }//遇到同性直接输出答案
        if(find(a,b,j))printf("Yes\n");
        else printf("No\n");
    }
    return 0;
}

手机扫一扫

移动阅读更方便

阿里云服务器
腾讯云服务器
七牛云服务器

你可能感兴趣的文章