找出直系亲属, 修改了许久,还是WA

helloDesword 2014-07-21 10:23:45
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、对于输入的两个带分析的节点,从深度大的节点出发,向上寻找节点,直到找到的节点与另一个节点的深度一致,这个时候,判断这两个节点的关系。深度一致找到的节点如果不相同则说明在不同的树上,反之则有对应的关系。

上代码:
//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麻烦各位帮帮忙了~
...全文
123 2 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
helloDesword 2014-07-22
  • 打赏
  • 举报
回复
引用 1 楼 logiciel 的回复:
LZ程序不能正确处理以下输入: 1 1 A-C 0 0 需修改以下一行可AC: if( buf[1] != '-') //改 if( buf[1] == '-') continue; PreNode[findid(buf[1])] = findid(buf[0]);
是的,就是这里! 谢谢哈~
logiciel 2014-07-21
  • 打赏
  • 举报
回复
LZ程序不能正确处理以下输入: 1 1 A-C 0 0 需修改以下一行可AC: if( buf[1] != '-') //改 if( buf[1] == '-') continue; PreNode[findid(buf[1])] = findid(buf[0]);
家谱管理系统,主要用来管理家族成员的基本信息 1、确定整个程序的功能模块。实现程序的主界面,要对主界面的功能选择输入进行容错处理。 2、实现单个结点信息的录入。 3、对录入日期信息进行合法性检验。 4、采用改变字体颜色的方式突出显示主界面的功能项。 5、计算从出生日期到死亡日期的实际天数 6、若家谱树为空,则新建家谱树。实现成员节点的添加。基本功能中可以 强制要求所有成员不同名,即不考虑同名情况(符合小家族的实际情况)。 7、添加成员节点时,可以选择将新添加的节点作为整个家谱的上一代祖先, 或者将新添加的节点作为某个现有成员的孩子。 8、作为某个现有成员的孩子,根据给出的父节点的姓名将该结点添加到相 应位置,注意,针对某一父节点,添加第一个孩子和其它孩子的区别。 9、要求在孩子兄弟二叉树中按各个孩子的年龄进行排序。 10、将家谱树保存到二进制文件。注意,不能保存空白节点。 11、从文件读入家谱信息,重建孩子兄弟二叉树形式的家谱。 12.从文件中读出所有节点信息到一个数组中,然后按一年中生日的先后进 行快速排序。 13、按姓名查询家谱成员并显示该成员的各项信息。 14、给出某一成员的姓名,删除该成员和该成员的所有子孙。 15、成员信息的修改。信息修改时要给出选择界面让用户选择需要修改的信 息项。基本功能中可以限定不容许修改父亲姓名和本人姓名。对日期信 息进行修改时要进行检验。 16、实现层次递进的方式显示整个家谱,显示结果应该体现家谱树的结构。 17、按各种关键字进行查询,要求给出关键字选择界面,并显示符合查询条 件的节点信息。 18、信息统计基本要求包括:平均身高,平均寿命,男女成员各多少,平均 家庭人口数目(假定每个成员构成一个家庭,该家庭的家庭成员是指成 员本人和他的孩子,即家庭人口数=孩子数+1)。要给出统计项的选择界 面. 19、查询某一成员的所有直系亲属。 20、给出某一成员的所有嫡系祖先。 21、确定两人关系。若两人辈分不等,则应指出甲是乙的多少代长辈(晚辈), 甲是否是乙的直系长辈(晚辈),若辈分相同,则应指出是亲兄弟还是多 少代的堂兄弟。

65,187

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧