65,187
社区成员




//http://acm.hdu.edu.cn/showproblem.php?pid=3786
#include<stdio.h>
#include<string.h>
// 构造二叉树,搜索谨记着从根节点往下面搜索就好 了。
//二叉树的构造可以仅仅使用一维数组。
int findid(char in)
{
return in - 'A';
}
int PreNode[30];
int Level[30];
int main()
{
int n,m,i,j;
while(scanf("%d%d",&n, &m) && (n!=0 || m != 0) )
{
memset(PreNode, -1, sizeof(PreNode));
memset(Level,0, sizeof(Level));
char buf[10];
for(i=0 ;i< n; i++)
{
scanf("%s",buf) ;
//二叉树,父亲节点为child
if( buf[1] == '-') continue;
PreNode[findid(buf[1])] = findid(buf[0]);
if( buf[2] == '-') continue;
PreNode[findid(buf[2])] = findid(buf[0]);
}
//计算到根节点的距离
for(i=0; i< 26 ;i++)
{
int depth = 0;
int ss = i;
while(PreNode[ss] != -1)
{
ss = PreNode[ss];
depth++;
}
Level[i] = depth;
}
/*
for(i=0 ;i< 26 ;i++)
{
printf("[%c]%c~%d,",i+'A','A'+PreNode[i],Level[i]);
if(i%5==0)
printf("\n");
}*/
//计算两点之间的关系
for(i=0 ;i< m ;i++)
{
scanf("%s",buf);
int a = findid(buf[0]);
int b = findid(buf[1]);
int rel = 0;//child relation
if( Level[a] > Level[b])//a的深度要比b的小
{
int temp;
temp = a;
a = b;
b= temp;
rel = 1;//parent relation
}
//计算两点之间的距离
int dis = 0;
while( Level[b] > Level[a] )
{
b = PreNode[b];
dis++;
}
if( b != a )
dis = 0;
//输出
char output[20] = "\0";
if( rel == 0)
{
strcpy(output,"child");
}
else
strcpy(output,"parent");
if( dis == 0 )
{
printf("-\n");
}
else if( dis == 1)
{
printf("%s\n",output);
}
else if( dis == 2)
{
printf("grand%s\n",output);
}
else
{
for(j=3 ; j<=dis ; j++)//错误在这里,变量重复使用
{
printf("great-");
}
printf("grand%s\n",output);
}
}
}
return 0;
}