最后测试二:B题

找出直系亲属

如果A,B是C的父母亲,则A,B是C的parent,C是A,B的child,如果A,B是C的(外)祖父,祖母,则A,B是C的grandparent,C是A,B的grandchild,如果A,B是C的(外)曾祖父,曾祖母,则A,B是C的great-grandparent,C是A,B的great-grandchild,之后再多一辈,则在关系上加一个great-。


Input


输入包含多组测试用例,每组用例首先包含2个整数n(0<=n<=26)和m(0<m<50), 分别表示有n个亲属关系和m个问题, 然后接下来是n行的形式如ABC的字符串,表示A的父母亲分别是B和C,如果A的父母亲信息不全,则用-代替,例如A-C,再然后是m行形式如FA的字符串,表示询问F和A的关系。
当n和m为0时结束输入。


Output


如果询问的2个人是直系亲属,请按题目描述输出2者的关系,如果没有直系关系,请输出-。
具体含义和输出格式参见样例.


Sample Input


3 2
ABC
CDE
EFG
FA
BE
0 0


Sample Output


great-grandparent

题解:简单的说这道题就是寻找两个亲戚的关系

感到很遗憾,这道题开始并不是自己想出来的,而是看了大佬的代码,然后参考大佬的思路,自己写的,
在写的的过程中也遇到了许许多多的困难,提交了很多次,不是MLE就是WA
这题看上去很简单,在最开始我准备用二叉树模拟,结果由于自己并不特别擅长,就始终没搞明白,然后就耐不住的看了大佬们的代码,看到有一个 运用的DFS搜索,于是我便开始往那方面尝试,看懂了大佬的思路后就开始一顿乱搞,过程出现了好多错误,最后不断找BUG最后还是得以AC

代码如下:

#include<iostream>
#include<cstdio>
#include<string>
#include<cstring>
using namespace std;
const int Max='Z'+1;
char xiPuTu[Max][2];                 //用来存放亲人关系,在这我起名比较low,就叫xiputu(系谱图)
int DFS(char a,char b,int num)    //DFS搜索
{
    if(a=='-')
        return (100);               //这里的返回值100其实没有任何意义,只是为了起到辨识的作用
    if(a==b)
        return num+1;
    int la,lb;             //la表示父亲那方,lb表示母亲那方
    la=DFS(xiPuTu[a][0],b,num+1);
    lb=DFS(xiPuTu[a][1],b,num+1);
    if(la>lb)
        return lb;
    else
        return la;
}
void PRINT(int num,int flag)   //打印
{ 
    if(flag==1)           //flag在main函数有说明
    {
        if(num==2)
            printf("child\n");
        else
        {
            while(num>3)
            {
                printf("great-");
                num--;
            }
            printf("grandchild\n");
        }
    }
    else
    {
        if(num==2)
            printf("parent\n");
        else
        {
            while(num>3)
            {
                printf("great-");
                num--;
            }
            printf("grandparent\n");
        }
    }
}
int main()
{
    int n,m;
    /*for(int i='A';i<Max;i++)
            xiPuTu[i][0]=xiPuTu[i][1]='-';*/             //如果放在这里,就会出现MLE
    while(~scanf("%d%d",&n,&m))
    {
        if(n==0&&m==0)
            break;
        for(int i='A';i<Max;i++)
            xiPuTu[i][0]=xiPuTu[i][1]='-';       //预处理   !!!!
        char a,b,c;
        string str;
        for(int i=0;i<n;i++)
        {
            cin>>str;           //如果采用scanf("%c%c%c",&a,&b,&c);将会WA,于是我采用了这样处理,参考的那个大佬的处理我并没看懂
            a=str[0];
            b=str[1];
            c=str[2];
            xiPuTu[a][0]=b;
            xiPuTu[a][1]=c;
        }
        int flag,num;            //其中flag表示是长辈关系还是晚辈关系,flag==1表示晚辈关系,flag==0表示长辈关系,应该容易理解
        for(int i=0;i<m;i++)
        {
            cin>>str;
            a=str[0];
            b=str[1];
            flag=1;
            num=DFS(a,b,0);
            if(num==100)
            {
                flag=0;
                num=DFS(b,a,0);
            }
            if(num==100)
            {
                printf("-\n");
                continue;
            }
            PRINT(num,flag);
        }
    }
    return 0;
}

希望可以帮到大家,小白心得

猜你喜欢

转载自blog.csdn.net/boliu147258/article/details/87869341