一、题目描述

如果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-。

输入描述:
输入包含多组测试用例,每组用例首先包含2个整数n(0<=n<=26)和m(0<m<50), 分别表示有n个亲属关系和m个问题, 然后接下来是n行的形式如ABC的字符串,表示A的父母亲分别是B和C,如果A的父母亲信息不全,则用-代替,例如A-C,再然后是m行形式如FA的字符串,表示询问F和A的关系。
输出描述:
如果询问的2个人是直系亲属,请按题目描述输出2者的关系,如果没有直系关系,请输出-。 具体含义和输出格式参见样例.
示例1
输入:

3 2
ABC
CDE
EFG
FA
BE

输出:

great-grandparent
-

二、思路和代码

思路:通过输入的关系构建树,用map存每个char对应的树节点指针。再向上或向下查询该树便可。(注释详细)

注意点:
1.每次使用指针时应该考虑是否为NULL
2.用char数组接收输入时应该多一位结束位,如输入ab应该用size为3的数组。
3.几种接收输入的方式:cin.get(字符数组名,接收字符数);cin.getline(接受字符串到m,接受个数5,结束字符),第三个参数默认为\0;cin>>;

#include <iostream>
#include <string>
#include <vector>
#include <map>
using namespace std;// 思路:构建树,搜索。用map存每个树结点的指针
// 结构体的初始化函数
typedef struct node {char value;node* fa;node* mo;vector<node*> child;node(char va, node* f, node* m) {this->value = va;this->fa = f;this->mo = m;}
}node;// 向上搜索,返回辈分差,若都找不到,返回-1
int searchUp(node* cur, node* obj) {//没找到if (cur == NULL) {return -1;}//找到了else if (cur->value == obj->value) {return 0;}else {int temp = searchUp(cur->fa, obj);int temp0 = searchUp(cur->mo, obj);if (temp != -1)return temp + 1;if (temp0 != -1)return temp0 + 1;return -1;}
}// 向下搜索,返回辈分差,若都找不到,返回-1
int searchDown(node* cur, node* obj) {//没找到if (cur == NULL) {return -1;}//找到了else if (cur->value == obj->value) {return 0;}else {int res;for (int i = 0; i < cur->child.size();i++) {res = searchDown(cur->child[i], obj);//找到了if (res != -1)return res + 1;}//没找到return -1;}
}
int main() {int x, y;cin >> x >> y;//接收每行输入,构建树,默认结点名不重复char temp[4];//ma存char与结点指针的映射map<char, node*> ma;for (int i = 0;i < x;i++) {cin >> temp;//构建三个节点,记录在ma中,有结点可能已经存在,tempnode分别为child,father,mothernode* tempnode[3];for (int j = 0;j < 3;j++) {if (temp[j] == '-') {tempnode[j] = NULL;continue;}if (ma.find(temp[j]) != ma.end()) {tempnode[j] = ma[temp[j]];}else {tempnode[j] = new node(temp[j], NULL, NULL);ma[temp[j]] = tempnode[j];}}//建立连接tempnode[0]->fa = tempnode[1];tempnode[0]->mo = tempnode[2];//使用指针时记得考虑是否为NULLif(tempnode[1]!=NULL)tempnode[1]->child.emplace_back(tempnode[0]);if(tempnode[2]!=NULL)tempnode[2]->child.emplace_back(tempnode[0]);}//查找树char temp0[3];node* first;node* second;int res;string resstr;for (int i = 0;i < y;i++) {cin >> temp0;// 从第一个结点开始向上或向下搜索//向上搜索first = ma[temp0[0]];second = ma[temp0[1]];res = searchUp(first, second);// 搜到了if (res != -1) {resstr = "child";res -= 1;if (res >= 1) {resstr = "grand" + resstr;res -= 1;}for (int j = 0;j < res;j++) {resstr = "great-" + resstr;}cout << resstr<<"\n";}// 没搜到else {// 向下搜索res = searchDown(first, second);//没搜到if (res == -1) {cout << "-"<<"\n";}else {resstr = "parent";res -= 1;if (res >= 1) {resstr = "grand" + resstr;res -= 1;}for (int j = 0;j < res;j++) {resstr = "great-" + resstr;}cout << resstr<<"\n";}}}return 0;
}

找出直系亲属-cpp相关推荐

  1. hdu3786 找出直系亲属 水题

    题意: 找出直系亲属 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total ...

  2. HDU3786 找出直系亲属【关系闭包】

    找出直系亲属 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submis ...

  3. 九度OJ 1035:找出直系亲属(二叉树)

    题目1035:找出直系亲属 时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:1309 解决:521 题目描述: 如果A,B是C的父母亲,则A,B是C的parent,C是A,B的child,如 ...

  4. KY122 找出直系亲属

    KY122 找出直系亲属 def cntGen(parentsDict, descendant, ascendant):if descendant not in parentsDict:return ...

  5. 九度[1035]-找出直系亲属

    九度[1035]-找出直系亲属 题目描述: 如果A,B是C的父母亲,则A,B是C的parent,C是A,B的child,如果A,B是C的(外)祖父,祖母,则A,B是C的grandparent,C是A, ...

  6. 九度1035:找出直系亲属并查集

    题目描述: 如果A,B是C的父母亲,则A,B是C的parent,C是A,B的child,如果A,B是C的(外)祖父,祖母,则A,B是C的grandparent,C是A,B的grandchild,如果A ...

  7. HDU_3786 找出直系亲属- softbar

    Problem Description 如果A,B是C的父母亲,则A,B是C的parent,C是A,B的child,如果A,B是C的(外)祖父,祖母,则A,B是C的grandparent,C是A,B的 ...

  8. 找出两个字符串中最大子字符串,如abractyeyt,dgdsaeactyey的最大子串为actyet

    // 最大子字符串.cpp : 定义控制台应用程序的入口点. // //找出两个字符串中最大子字符串,如"abractyeyt","dgdsaeactyey"的 ...

  9. 微软面试题系列(四):在二元树中找出和为某一值的所有路径

    有了第一题作为基础,这一题写起来也相当简单.只是搜索的时候呢,可以剪枝一下.这个是搜索的技巧,用多了就自然有这个习惯了! 建树依然建立二元查找树,然后用深搜,用一个path数组把结点的值存储起来.用深 ...

  10. 在数组中找出3个数使得它们和为0

    题目: 给定一个集合S,试找出3个数a, b, c,使得a+b+c=0.也即从集合中找出所有的和为0的3个数. 例如:集合S={-1,0, 1, 2, -1, 4},则满足条件的3个数有2对:(-1, ...

最新文章

  1. visual studio2010-2015编译部署caffe
  2. Java开发程序员最值得学习的10大技术
  3. Little Sub and Traveling
  4. 第一个MapReduce程序-------WordCount
  5. 1 | GNN基础理论
  6. C、C++语言中参数的压栈顺序
  7. 学无止境,我还在进步
  8. HTTP权威指南笔记
  9. PowerDesigner生成sql建表语句
  10. 8、(八)外汇基础篇之外汇期权交易
  11. 树莓派 python驱动蜂鸣器
  12. html5 竖线的实现,border 实现竖线
  13. 给定经纬度定位某个城市
  14. 我点美团为什么会显示服务器错误,美团服务器崩了 外卖App在部分区域出现了故障...
  15. Javascript中LenB的计算(ASP)
  16. K8S pod 时区设置
  17. 一个正确的编程学习方法
  18. ghost使用图解加详细说明
  19. 植物大战僵尸以及超级玛丽源码分享
  20. 浙江省计算机一级linux,浙江省大学计算机一级Linux及其浙江省大学计算机三级Linux网络管理及其应用.doc...

热门文章

  1. Android虚拟机的安装
  2. js操作图片像素进行编辑
  3. 360断网急救箱 dns服务器未响应,发现DNS服务异常,用360断网急救箱修复后过一段时间又复发。怎么办?...
  4. MFC中画出圆形按钮,告别方形普通按钮
  5. 京东获取商品历史价格信息 API接口
  6. 西南大学网络作业答案计算机,2019西南大学继续教育学院《计算机基础》作业答案...
  7. 华为钱包扫码云闪付_华为钱包、云闪付,NFC支付要这样使用!!!-已回复
  8. 彻底解决unable to find valid certification path to requested target
  9. 采用Matlab解决最小曼哈顿图问题
  10. python必背的英语单词怎么写_背英语单词的最好方法