找出直系亲属
如果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;
}
希望可以帮到大家,小白心得