这是一道PTA中的题目,在这里先给出题干。

7-2 家谱处理 (30 分)

人类学研究对于家族很感兴趣,于是研究人员搜集了一些家族的家谱进行研究。实验中,使用计算机处理家谱。为了实现这个目的,研究人员将家谱转换为文本文件。下面为家谱文本文件的实例:

JohnRobertFrankAndrewNancyDavid

家谱文本文件中,每一行包含一个人的名字。第一行中的名字是这个家族最早的祖先。家谱仅包含最早祖先的后代,而他们的丈夫或妻子不出现在家谱中。每个人的子女比父母多缩进2个空格。以上述家谱文本文件为例,John这个家族最早的祖先,他有两个子女RobertNancyRobert有两个子女FrankAndrewNancy只有一个子女David

在实验中,研究人员还收集了家庭文件,并提取了家谱中有关两个人关系的陈述语句。下面为家谱中关系的陈述语句实例:

John is the parent of Robert
Robert is a sibling of Nancy
David is a descendant of Robert

研究人员需要判断每个陈述语句是真还是假,请编写程序帮助研究人员判断。

输入格式:

输入首先给出2个正整数N(2≤N≤100)和M(≤100),其中N为家谱中名字的数量,M为家谱中陈述语句的数量,输入的每行不超过70个字符。

名字的字符串由不超过10个英文字母组成。在家谱中的第一行给出的名字前没有缩进空格。家谱中的其他名字至少缩进2个空格,即他们是家谱中最早祖先(第一行给出的名字)的后代,且如果家谱中一个名字前缩进k个空格,则下一行中名字至多缩进k+2个空格。

在一个家谱中同样的名字不会出现两次,且家谱中没有出现的名字不会出现在陈述语句中。每句陈述语句格式如下,其中XY为家谱中的不同名字:

X is a child of Y
X is the parent of Y
X is a sibling of Y
X is a descendant of Y
X is an ancestor of Y

输出格式:

对于测试用例中的每句陈述语句,在一行中输出True,如果陈述为真,或False,如果陈述为假。

输入样例:

6 5
JohnRobertFrankAndrewNancyDavid
Robert is a child of John
Robert is an ancestor of Andrew
Robert is a sibling of Nancy
Nancy is the parent of Frank
John is a descendant of Andrew

输出样例:

True
True
True
False
False

一道模拟题,讲思路之前,先带着我自己捋一下啥叫descendant(后代)、ancestor(祖先)。

ancestor(祖先):简单的来说就是你爸爸、你爷爷。。。那些你叔叔啥的都不算。

descendant(后代):和上面差不多,就是说你孙子,你儿子,那些叫你叔叔舅舅啥的都不算。

这两个概念,就懵逼了一会,语文是硬伤,下面开始说这道题的思路。

一道模拟题,用数据结构储存数据进行查找,利用string的各种函数对字符串进行操作(注意:PTA为了安全起见是禁止使用gets函数的,所以才有了下面代码对输入处理的那一段)

推荐自己写一下,思路不难,具体的实现细节需要好好去卡一下。(还有备注一定要及时的注释掉,否则呜呜呜)

下面给出AC代码:

​
#include <bits/stdc++.h>using namespace std;struct node
{char name[100];char father[100];int num;
} ple[1000];int main()
{int m,n;scanf("%d %d",&m,&n);getchar();for(int i=0; i<m; i++){char t[100];string s; getline(cin,s);int len=s.size();for(int j=0;j<len;j++){t[j]=s[j];}t[len]=0;int len1=0;for(int j=0; j<len; j++){if(t[j]!=' '){len1=j;ple[i].num=j;strcpy(ple[i].name,t+j);break;}}if(len1==0) strcpy(ple[i].father,"root");else{for(int j=i-1; j>=0; j--){if(ple[i].num>ple[j].num){strcpy(ple[i].father,ple[j].name);break;}}}}char s6[100],s1[100],s2[100],s3[100],s4[100],s5[100];for(int i=0; i<n; i++){scanf("%s %s %s %s %s %s",s1,s2,s3,s4,s5,s6);node p1,p2;for(int j=0; j<m; j++){if(strcmp(s1,ple[j].name)==0){p1.num=ple[j].num;strcpy(p1.name,ple[j].name);strcpy(p1.father,ple[j].father);break;}}for(int j=0; j<m; j++){if(strcmp(s6,ple[j].name)==0){p2.num=ple[j].num;strcpy(p2.name,ple[j].name);strcpy(p2.father,ple[j].father);break;}}if(strcmp(p1.name,p2.name)==0){printf("False\n");continue;}if(s4[0]=='c'){//cout<<"gg1      "<<p1.num<<"   "<<p2.num<<"   "<<p1.father<<"    "<<p2.name<<endl;if(strcmp(p2.name,p1.father)==0) printf("True\n");else printf("False\n");}else if(s4[0]=='a'){if(strcmp(p1.father,"root")==0){printf("True\n");continue;}while(strcmp(p1.name,p2.father)!=0&&strcmp(p2.father,"root")!=0){for(int k=0;k<m; k++){if(strcmp(p2.father,ple[k].name)==0){strcpy(p2.father,ple[k].father);}}}if(strcmp(p2.father,"root")==0)  printf("False\n");else printf("True\n");}else if(s4[0]=='s'){if(strcmp(p1.father,p2.father)==0) printf("True\n");else printf("False\n");}else if(s4[0]=='p'){if(strcmp(p1.name,p2.father)==0)   printf("True\n");else printf("False\n");}else if(s4[0]=='d'){//cout<<"gg    "<<p1.father<<endl;if(strcmp(p2.father,"root")==0){printf("True\n");continue;}while(strcmp(p2.name,p1.father)!=0&&strcmp(p1.father,"root")!=0){//cout<<"gg     "<<p1.father<<endl;for(int k=0;k<m; k++){if(strcmp(p1.father,ple[k].name)==0){//cout<<"gg11111     "<<p1.father<<"       "<<ple[i].name<<endl;strcpy(p1.father,ple[k].father);}}}if(strcmp(p1.father,"root")==0)  printf("False\n");else printf("True\n");}}return 0;
}​

数据结构—— 家谱处理相关推荐

  1. 数据结构——家谱管理系统

    一.功能要求 (1)用缩进表示法输出家谱二叉树 (2)查找某人所有的儿子 (3)查找某人所有的祖先 二.功能模块图 三.测试分析 系统界面 建立家谱 查询家谱树 查询儿子 查询祖先 退出页面 不合理数 ...

  2. 数据结构家谱c语言课程设计,数据结构和C语言的课程设计

    程序设计 程序设计语言: 问题1:某一段C语言的源程序代码以文件方式存储,文件中含有字母.数字以及其他字符,对文件中的C语言的关键字,进行扫描统计.建立C语言关键字的数据文件key.txt,从源程序文 ...

  3. #数据结构:家谱管理

    家谱管理 一.问题描述 设计一个程序,采用二叉树表示一个家谱关系. 二.基本要求 1) 用缩进表示法输出家谱二叉树. 2) 查找某人所有的儿子. 3) 查找某人所有的祖先. 三.算法思想 二叉树的建立 ...

  4. 数据结构课程设计家谱c语言,数据结构课程设计-家谱的实现与设计.doc

    数据结构课程设计-家谱的实现与设计 课 程 设 计 报 告 课程设计名称:数据结构课程设计 系 : 三系 学 生 姓 名 : 朱强 班 级: 13软件 学 号: 20130311227 成 绩: 指 ...

  5. 家谱(特殊的层级人物关系)数据结构与自动排版算法的一种实现

    github源代码(家谱海本地私有版):https://github.com/fengchangfight/familytreesea 出处:http://www.fengchang.cc/post/ ...

  6. 数据结构实战(十)——家谱管理系统

    任务简述 实现具有下列功能的家谱管理系统. 基本要求: (1)输入文件以存放最初家谱中各成员的信息,成员的信息中均应包含以下内容:姓名.出生日期.婚否.地址.健在否.死亡日期(若其已死亡),也可附加其 ...

  7. c语言二叉树族谱管理系统,数据结构课程设计报告(用二叉树实现家谱管理系统).doc...

    数据结构课程设计 题目:用二叉树实现家谱管理系统 姓名:郭志超 学号:031010151554042 完成日期:2005.7.3 一.需求分析 ??建立输入文件以存放最初家谱中各成员的信息. ??成员 ...

  8. 数据结构课程设计(八)---家谱管理系统(十几个功能)

    1.任务简述: 实现具有下列功能的家谱管理系统. 要求: (1)输入文件以存放最初家谱中各成员的信息,成员的信息中均应包含以下内容:姓名.出生日期.婚否.地址.健在否.死亡日期(若其已死亡),也可附加 ...

  9. 基于C语言的数据结构课程设计(学生管理系统、停车场管理、家谱管理、校园导航系统)

    一.设计目的 本课程设计是软件工程学生的必修课程,数据结构与算法课程设计既是一门基础课程,又是一门实践性课程.通过本实训课程的学习和训练,使同学学会分析研究数据对象的特性,学会数据的组织方法,以便选择 ...

最新文章

  1. R语言安装.tar.gz包
  2. python 批量resize性能比较
  3. Python Django URL逆向解析(通过Python代码逆向访问)代码示例
  4. elasticsearch mapping之fields
  5. php mongodb排序查询,Mongodb 如何按照内嵌文档的某个字段排序?
  6. Redis之高级特性
  7. jetty java heap space_JFinal + HTTL + jdk1.7 启动服务内存溢出,Java heap space 但jdk1.6正常...
  8. C++接收字符串数组_Java 中初始化数组
  9. CentOs7.5离线静默安装Oracle12c
  10. 沐雪微信平台---企业微信营销专家
  11. 手动实现JSON.stringify
  12. 焕然一新的 Vue 3 中文文档来了
  13. hdu 5144 NPY and shot
  14. php使用加密狗,加密狗使用方法
  15. tcpcopy mysql_MySQL容量规划之tcpcopy应用之道 西橙
  16. Photoshop二次开发接口介绍
  17. Attention!当推荐系统遇见注意力机制
  18. 如何做好Clickhouse集群的监控覆盖?
  19. .net Core WebApi记录
  20. 思科交换机基础--11三层交换机ACL配置

热门文章

  1. Acwing 265. 营业额统计
  2. Kafka使用报错Subscription to topics, partitions and pattern are mutually exclusive
  3. Java实现火车购票系统功能
  4. DBA生活篇之休闲:不做宅男!
  5. Linux 命令 poll 和 ppoll 详解 + 实例
  6. HDR视频色调映射算法(之四:Display adaptive TMO)
  7. Python 为什么不支持 switch 语句?
  8. overleaf表格_搞定LaTeX论文中的表格
  9. Hadoop生态系统——HiveQL操作实战
  10. linux下wifi设备的实现逻辑