思路:由于没有分左右节点,故不用分左右子树。直接建立从母节点到子节点的的树即可
#include<iostream>
using namespace std;
#include<string>
int n,m;
int tree[150];
string fa[3]={"","parent","grandparent"};
string son[3]={"","child","grandchild"};
int steps;
void initial()
{
for(int i=0;i<150;i++)
tree[i]=i;
}
int find(int x,int y) //return numbers of pile
{
int i=0;
while(tree[x]!=x) //from father ->son
{
i++;
if(tree[x]==y)
{
return i;
}
x=tree[x];
}
return 0;
}
int main()
{
cin>>n>>m;
string mm;
string nn;
initial();
for(int i=0;i<n;i++)
{
cin>>mm;
if(mm[1]!='-')
tree[mm[1]-'A']=mm[0]-'A';
if(mm[2]!='-')
tree[mm[2]-'A']=mm[0]-'A';
}
for(int j=0;j<m;j++)
{
cin>>nn;
if(steps=find(nn[0]-'A',nn[1]-'A'))
{
if(steps<3)
{
cout<<fa[steps]<<endl;
}else {
for(int m=1;m<=steps-2;m++)
cout<<"great-";
cout<<fa[2]<<endl;
}
}else if(steps=find(nn[1]-'A',nn[0]-'A'))
{
if(steps<3)
{
cout<<son[steps]<<endl;
}else {
for(int m=1;m<=steps-2;m++)
cout<<"great-";
cout<<son[2]<<endl;
}
}else cout<<'-'<<endl;
}
return 0;
}