题目1035:找出直系亲属
#include<stdio.h>
#include<string.h>
#include<iostream>
#include <algorithm>
#include<math.h>
using namespace std;
#define oo 1<<28
int dist[101];//存储子节点
int n,m;
void init()
{
int i;
for(i=0;i<27;i++)
{
dist[i]=-1;
}
}
int findd(int x,int y)//从上到下查找
{
int num=1;
while(dist[x]!=-1)
{
if(dist[x]==y) return num;//找到y是x的子节点,返回差值
else{
x=dist[x];//如果y不是x的直接子节点,一点点向下找,找一次加一次
++num;
}
}
return -1;
}
int main()
{
int i,j;
char x,y,z,u,v;
while(cin >> n >> m,n)
{
init();
for(i=0;i<n;i++)
{
cin >> x >> y >> z;
dist[y-'A']=x-'A';
dist[z-'A']=x-'A';
}
for(i=0;i<m;i++)
{
cin >> u >> v;
int f1=findd(u-'A',v-'A');
int f2=findd(v-'A',u-'A');//正负值代表uv谁在上谁在下
int num=f1>f2?f1:f2;
//cout << num << endl;
if(num==-1)//如果为-1说明u不是v的父节点,v也不是u的父节点
{
cout << '-' << endl;
}
else
{
if(f1>=0)//u是v的父节点
{
if(num==1)
cout << "parent" << endl;
else{
for(j=0;j<num-2;j++)
cout << "great-" ;
cout << "grandparent" << endl;
}
}
else//u是v的子节点
{
if(num==1)
cout << "child" << endl;
else{
for(j=0;j<num-2;j++)
cout << "great-";
cout << "grandchild" << endl;
}
}
}
}
}
return 0;
}