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

  1. John
  2. Robert
  3. Frank
  4. Andrew
  5. Nancy
  6. David

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

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

  1. John is the parent of Robert
  2. Robert is a sibling of Nancy
  3. David is a descendant of Robert

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

输入格式:

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

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

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

  1. X is a child of Y
  2. X is the parent of Y
  3. X is a sibling of Y
  4. X is a descendant of Y
  5. X is an ancestor of Y

输出格式:

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

输入样例:

  1. 6 5
  2. John
  3. Robert
  4. Frank
  5. Andrew
  6. Nancy
  7. David
  8. Robert is a child of John
  9. Robert is an ancestor of Andrew
  10. Robert is a sibling of Nancy
  11. Nancy is the parent of Frank
  12. John is a descendant of Andrew

输出样例:

  1. True
  2. True
  3. True
  4. False
  5. False
  1. #include <iostream>
  2. #include <string.h>
  3. #include <string>
  4. #include <algorithm>
  5. #include <math.h>
  6. #include <stdlib.h>
  7. #include <map>
  8. using namespace std;
  9. int n,m;
  10. char b[105];
  11. map<string,int> a;
  12. int f[105];
  13. string s;
  14. int num[105];
  15. int main()
  16. {
  17.     scanf("%d%d\n",&n,&m);
  18.     int cnt=0;
  19.     memset(num,0,sizeof(num));
  20.     memset(f,0,sizeof(f));
  21.     for(int i=1;i<=n;i++)
  22.     {
  23.         gets(b);
  24.         s="";
  25.         for(int j=0;b[j]!='\0';j++)
  26.         {
  27.             if(b[j]==' ')
  28.                 num[i]++;
  29.             else
  30.                 s+=b[j];
  31.         }
  32.         a[s]=++cnt;
  33.         for(int k=i-1;k>=1;k--)
  34.         {
  35.             if(num[i]==num[k])
  36.             {
  37.                 f[i]=f[k];
  38.                 break;
  39.             }
  40.             if(num[i]==(num[k]+2))
  41.             {
  42.                 f[i]=k;
  43.                 break;
  44.             }
  45.         }
  46.     }
  47.     string x="",y="",z="";
  48.     for(int i=1;i<=m;i++)
  49.     {
  50.         x="";y="";z="";
  51.         gets(b);
  52.         int tag=1;
  53.         for(int j=0;b[j]!='\0';j++)
  54.         {
  55.             if(b[j]==' ')
  56.             {
  57.                 tag++;
  58.                 continue;
  59.             }
  60.             if(tag==1)
  61.                 x+=b[j];
  62.             else if(tag==6)
  63.                 y+=b[j];
  64.             else if(tag==4)
  65.             {
  66.                 z+=b[j];
  67.             }
  68.         }
  69.         int ans=0;
  70.         int fx=a[x];int fy=a[y];
  71.         if(z.find("c")==0)
  72.         {
  73.             if(f[fx]==fy)
  74.                 ans=1;
  75.         }
  76.         else if(z.find("a")==0)
  77.         {
  78.             while(fy!=0)
  79.             {
  80.                 if(fx==f[fy])
  81.                 {
  82.                    ans=1;
  83.                     break;
  84.                 }
  85.                 fy=f[fy];
  86.             }
  87.         }
  88.         else if(z.find("s")==0)
  89.         {
  90.             if(f[fx]==f[fy])
  91.                 ans=1;
  92.         }
  93.         else if(z.find("p")==0)
  94.         {
  95.             if(f[fy]==fx)
  96.                 ans=1;
  97.         }
  98.         else if(z.find("d")==0)
  99.         {
  100.             while(fx!=0)
  101.             {
  102.                 if(fy==f[fx])
  103.                 {
  104.                     ans=1;
  105.                     break;
  106.                 }
  107.                 fx=f[fx];
  108.             }
  109.         }
  110.         if(!ans)
  111.             printf("False\n");
  112.         else
  113.             printf("True\n");
  114.     }
  115.     return 0;
  116. }
  117.  

pta 习题集5-17 家谱处理的更多相关文章

  1. pta 习题集 5-5 最长连续递增子序列 (dp)

    给定一个顺序存储的线性表,请设计一个算法查找该线性表中最长的连续递增子序列.例如,(1,9,2,5,7,3,4,6,8,0)中最长的递增子序列为(3,4,6,8). 输入格式: 输入第1行给出正整数n ...

  2. PTA 习题集5-18 打印选课学生名单(哈希)

    假设全校有最多40000名学生和最多2500门课程.现给出每个学生的选课清单,要求输出每门课的选课学生名单. 输入格式: 输入的第一行是两个正整数:N(≤40000),为全校学生总数:K(≤2500) ...

  3. pta习题集5-16 地下迷宫探索

    地道战是在抗日战争时期,在华北平原上抗日军民利用地道打击日本侵略者的作战方式.地道网是房连房.街连街.村连村的地下工事,如下图所示. 我们在回顾前辈们艰苦卓绝的战争生活的同时,真心钦佩他们的聪明才智. ...

  4. pta 习题集5-17 哥尼斯堡的“七桥问题”

    哥尼斯堡是位于普累格河上的一座城市,它包含两个岛屿及连接它们的七座桥,如下图所示. 可否走过这样的七座桥,而且每桥只走过一次?瑞士数学家欧拉(Leonhard Euler,1707-1783)最终解决 ...

  5. pta习题集5-16 朋友圈

    某学校有N个学生,形成M个俱乐部.每个俱乐部里的学生有着一定相似的兴趣爱好,形成一个朋友圈.一个学生可以同时属于若干个不同的俱乐部.根据"我的朋友的朋友也是我的朋友"这个推论可以得 ...

  6. pta 习题集5-19 列车厢调度

    1 ====== <--移动方向 / 3 ===== \ 2 ====== -->移动方向 大家或许在某些数据结构教材上见到过"列车厢调度问题"(当然没见过也不要紧). ...

  7. pta 习题集5-18 打印学生选课清单

    假设全校有最多40000名学生和最多2500门课程.现给出每门课的选课学生名单,要求输出每个前来查询的学生的选课清单. 输入格式: 输入的第一行是两个正整数:N(≤≤40000),为前来查询课表的学生 ...

  8. pta习题集 5-10 切分表达式——写个tokenizer吧

    [先说点出题背景] 这个题是为低年级同学.学C语言的同学准备的,因为,对这部分同学,这个题目编写起来略有一点复杂.如果是高年级.学过了正则表达式(Regular Expression)的同学或者学过了 ...

  9. pta 习题集 5-15 数组循环左移

    本题要求实现一个对数组进行循环左移的简单函数:一个数组aa中存有nn(>0>0)个整数,在不允许使用另外数组的前提下,将每个整数循环向左移mm(≥0≥0)个位置,即将aa中的数据由(a0a ...

随机推荐

  1. e555. 在Applet中播放音频

    // See also e551 精简的Applet public void init() { // Load audio clip AudioClip ac = getAudioClip(getDo ...

  2. OpenCV_基于局部自适应阈值的图像二值化

    在图像处理应用中二值化操作是一个很常用的处理方式,例如零器件图片的处理.文本图片和验证码图片中字符的提取.车牌识别中的字符分割,以及视频图像中的运动目标检测中的前景分割,等等. 较为常用的图像二值化方 ...

  3. 解决error: Your local changes to the following files would be overwritten by merge

    在项目里我们一般都会把自己第一次提交的配置文件忽略本地跟踪 1 [Sun@webserver2 demo]$ git update-index --assume-unchanged <filen ...

  4. html5实现刮刮卡效果

    通过Canvas实现的可刮涂层效果. 修改img.src时涂层也会自动适应新图片的尺寸. 修改layer函数可更改涂层样式. 涂层: 可刮效果: 以下是HTML源代码(已增加移动设备支持): 1 2 ...

  5. 加L“”

    error C2665: “AfxMessageBox”: 2 个重载中没有一个可以转换所有参数类型 初学.net,编写如下代码运行,竟然提示错误(error C2665: “AfxMessageBo ...

  6. 帝国留言板管理员回复发送EMAIL通知客户

    说明:修改1:e/admin/tool/ReGook.php   /*回复表单*/ 43行处添加代码 ------------------------------------------------- ...

  7. work,i/o最小线程设置

    设置work i/o最小线程有两种方式1.通过配置文件设置,影响所有iis部署程序(待验证)2.通过程序代码设置,iis上部署的程序互不影响int minWorker, minIOC; //Get t ...

  8. 再次谈谈easyui datagrid 的数据加载

    from:http://www.easyui.info/archives/204.html 这篇文章只谈jQuery easyui datagrid 的数据加载,因为这也是大家谈论最多的内容.其实ea ...

  9. JBPM4.4_核心概念与相关API

    1. 核心概念与相关API(Service API) 1.1. 概念:Process definition, process instance ,  execution 1.1.1. Process ...

  10. 超全面的JavaWeb笔记day18<事务&连接池&DBUtils>

    1.事务 ACID 原子性 一致性 隔离性 持久性 mysql中开启和关闭事务 开启事务:START TRANSACTION 结束事务 提交事务:COMMIT 回滚事务:ROLLBACK JDBC中开 ...