找出直系亲属, 修改了许久,还是WA
http://acm.hdu.edu.cn/showproblem.php?pid=3786
题目内容:
Problem Description
如果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
-
我的思路是:
1、建立一个二叉树,根节点是晚辈,即child,grandchild等。叶子是长辈。
2、分别计算所有节点离根节点的深度。
3、对于输入的两个带分析的节点,从深度大的节点出发,向上寻找节点,直到找到的节点与另一个节点的深度一致,这个时候,判断这两个节点的关系。深度一致找到的节点如果不相同则说明在不同的树上,反之则有对应的关系。
上代码:
找了许久,还是WA麻烦各位帮帮忙了~
题目内容:
Problem Description
如果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
-
我的思路是:
1、建立一个二叉树,根节点是晚辈,即child,grandchild等。叶子是长辈。
2、分别计算所有节点离根节点的深度。
3、对于输入的两个带分析的节点,从深度大的节点出发,向上寻找节点,直到找到的节点与另一个节点的深度一致,这个时候,判断这两个节点的关系。深度一致找到的节点如果不相同则说明在不同的树上,反之则有对应的关系。
上代码:
//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;
}找了许久,还是WA麻烦各位帮帮忙了~

...全文
相关推荐
H3C WA5300系列胖FAT版本(适用于WA5530、WA5510E-T、WA5530-SI、WA5630X、WA5320X、WA5320X-SI
H3C WA5300系列版本(适用于WA5530、WA5510E-T、WA5530-SI、WA5630X、WA5320X、WA5320X-SI、WA5320X-E、WAP723-W2、WAP722X-
H3C WA2620 WA2610 WA2612等AP FAT固件
在IT行业中,无线接入点(Access Point,简称AP)是构建无线网络的关键设备,而H3C作为一家知名的网络设备供应商,提供了多种型号的AP,包括WA2620、WA2612和WA2610。
H3C WA4320H-acn FAT版本固件
适用于WA4320i-X、WA4320i-ACN、WA4320H-ACN、WA4320-ACN、WA4320-TQ、WA4320-TS、WA4320-TQ-V、WAP722、WAP722E、WA432
H3C WA4320固件
标题中的“H3C WA4320固件”指的是H3C公司为WA4320无线接入点(Access Point)设计的固件更新。H3C是华为的子公司,专注于网络设备和服务,其产品广泛应用于企业级网络建设。
H3C WA4300S系列(适用于WA4320、WA4320-ACN-C、WA4320-ACN-SI、WA4320-ACN-PI、WAP722S
H3C WA4300S系列(适用于WA4320、WA4320-ACN-C、WA4320-ACN-SI、WA4320-ACN-PI、WAP722S、WAP712、WAP712C、WA4320-ACN-E


