出处:http://blog.csdn.net/strokess/article/details/50958958

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

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个正整数NN(2\le N\le 1002≤N≤100)和MM(\le 100≤100),其中NN为家谱中名字的数量,MM为家谱中陈述语句的数量,输入的每行不超过70个字符。

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

没用二叉树。。学习了个比较牛的做法

参考博客:http://blog.csdn.net/u013827143/article/details/28676703

[cpp] view plaincopy
  1. #include <iostream>
  2. #include <cstdio>
  3. #include <cstring>
  4. #include <algorithm>
  5. #include <vector>
  6. #include <map>
  7. using namespace std;
  8. int main(){
  9. int n, m;
  10. scanf("%d %d", &n, &m);
  11. getchar();
  12. map<string, string> f;
  13. vector<string> last(110);  //预先分配好110的大小
  14. string name;
  15. int i;
  16. int cnt = 0;
  17. for(i = 0; i < n; i++) {
  18. getline(cin, name);
  19. cnt = count(name.begin(), name.end(), ' ');  //计算空格的数量
  20. name = name.substr(cnt);
  21. if(cnt == 0) {
  22. f[name] = "root";
  23. last[0] = name;
  24. }
  25. else {
  26. f[name] = last[cnt / 2 - 1];  //记录上一个父节点
  27. last[cnt / 2] = name;
  28. }
  29. }
  30. string a, b, c, d;
  31. for(i = 0; i < m; i++) {
  32. cin >> a >> d >> d >> b >> d >> c;
  33. if(b[0] == 'c') {
  34. if(f[a] == c) printf("True\n");
  35. else printf("False\n");
  36. }
  37. else if(b[0] == 'p') {
  38. if(f[c] == a) printf("True\n");
  39. else printf("False\n");
  40. }
  41. else if(b[0] == 's') {
  42. if(f[c] == f[a]) printf("True\n");
  43. else printf("False\n");
  44. }
  45. else if(b[0] == 'a') {
  46. while(f[c] != a && f[c] != "root") c = f[c];
  47. if(f[c] == "root") printf("False\n");
  48. else printf("True\n");
  49. }
  50. else if(b[0] == 'd') {
  51. while(f[a] != c && f[a] != "root") a = f[a];
  52. if(f[a] == "root") printf("False\n");
  53. else printf("True\n");
  54. }
  55. }
  56. return 0;
  57. }

数据结构家族谱问题(map)相关推荐

  1. 家族谱树形数据结构实现

    简单的家族谱编辑展示 数据库的表结构设计 每一个家族谱的节点都有一个parentid  对应的父节点,和一个手机号码,通过手机号码以及人物的psid就能准备的定位这个人物在哪张家族谱中以及位置. 这个 ...

  2. 家族谱管理系统(C语言版)

    家族谱管理系统 一.本程序功能框架图 二 .系统功能 (1) 文件操作功能:记录输入.记录输出.初始化:用户可建立一个家族的族谱保存在文件中.在其后的操作中,可从文件里读取族谱信息.增加新的家族成员. ...

  3. 中国电子科技集团公司家族谱及信息

    中国电子科技集团公司家族谱及信息(持续更新) 中电集团下属的研究所一直都是各大高校电磁场与微波专业的毕业生们就业选择的一大去向,今天看到射频百花潭的公众号发了中国电子科技集团公司家族族谱,想问下知友们 ...

  4. golang数据结构初探之字典map

    Map Go语言的map底层使用Hash表实现的 特性预览 操作方式 初始化 map分别支持字面量初始化和内置函数make()初始化 字面量初始化 func MapInit() {m := map[s ...

  5. sizzle.js学习笔记利用闭包模拟实现数据结构:字典(Map)

    sizzle.js学习笔记利用闭包模拟实现数据结构:字典(Map) 这几天学习和查看了jQuery和Property这两个很流行的前端库的御用选择器组件Sizzle.js的源代码,收获还是相对多的!之 ...

  6. C语言家族谱管理系统

    C语言家族谱管理系统 1.家族谱建立 每个成员包含(姓名(关键字.不重复).性别.妻子.出生日期.死亡日期(可空)) 简化设计,使用二叉树表示,假定每个成员最多2个孩子 女儿的孩子不进家谱 2.家族谱 ...

  7. Python基础,基本类型(整型,浮点数等)数据结构(List,dic(Map),Set,Tuple),控制语句(if,for,while,continue or break):来自学习资料

    3.Python 基础 3.1.语法 Python的语法比较简单,采用缩进方式. i = -100 if i >= 0:print(i) else:print(-i) 3.2.基本类型 3.2. ...

  8. Java中常见数据结构:list与map

    1 1:集合 2 Collection(单列集合) 3 List(有序,可重复) 4 ArrayList 5 底层数据结构是数组,查询快,增删慢 6 线程不安全,效率高 7 Vector 8 底层数据 ...

  9. 数据结构思维 第九章 `Map`接口

    第九章 Map接口 原文:Chapter 9 The Map interface 译者:飞龙 协议:CC BY-NC-SA 4.0 自豪地采用谷歌翻译 在接下来的几个练习中,我介绍了Map接口的几个实 ...

最新文章

  1. java tif格式图片_java给tif格式图片加文字水印?
  2. centos snmp配置_Cacti1.2.16最新版安装和配置(Shell一键安装)
  3. 80后——后海——烟袋斜街
  4. Linux CentOS修改网卡IP/网关设置
  5. 最新消息!Cloudera 全球发行版正式集成 Apache Flink
  6. 现在被apihook搞郁闷了.....进展很慢...先放上几个必用的api说明吧.
  7. OrCAD设计原理图
  8. netbeans运行KEmulator
  9. The RSpec Book笔记《二》Describing Features描述功能
  10. mes系统服务器架构,MES系统三大层结构是什么
  11. ZZULIOJ 1919 D
  12. 系统论、控制论和信息论
  13. 手把手教你创建第一个Vivado工程
  14. 高防CDN好在哪里?哪些行业可以选择高防CDN?
  15. 【bzoj3573】[Hnoi2014]米特运输
  16. 微软股价史高,不干了这碗CEO亲自熬的鸡汤?
  17. 爬虫基础(案例:爬取17K小说个人书架信息)
  18. 免费创建一个令人惊叹的网站的7个技巧
  19. 网站一键修改黑白色方法(附代码)
  20. 华为工程师,带你实战C++(2016版)-王桂林-专题视频课程

热门文章

  1. 用threejs创建流动的水管
  2. Linux ubuntu MySQL 定时备份/手动备份/还原 测试教程
  3. 源码分析 Sentinel 实时数据采集实现原理
  4. 【转】VMware Workstation 11 永久激活码key 非注册机
  5. 【ASP.NET】VS2015连接SQL Server数据库,实现登录、注册
  6. Android系统Settings添加语言
  7. 淘宝蓝海产品开直通车,销量翻了10倍
  8. 浪潮信息释放数据之力 提供安全可靠、绿色高效的智慧医疗数据基础设施
  9. 蓝桥杯单片机按键模块化编程
  10. Lattice Diamond设置Notepad++为默认编辑器