找出直系亲属-cpp
一、题目描述
如果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相关推荐
- hdu3786 找出直系亲属 水题
题意: 找出直系亲属 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total ...
- HDU3786 找出直系亲属【关系闭包】
找出直系亲属 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submis ...
- 九度OJ 1035:找出直系亲属(二叉树)
题目1035:找出直系亲属 时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:1309 解决:521 题目描述: 如果A,B是C的父母亲,则A,B是C的parent,C是A,B的child,如 ...
- KY122 找出直系亲属
KY122 找出直系亲属 def cntGen(parentsDict, descendant, ascendant):if descendant not in parentsDict:return ...
- 九度[1035]-找出直系亲属
九度[1035]-找出直系亲属 题目描述: 如果A,B是C的父母亲,则A,B是C的parent,C是A,B的child,如果A,B是C的(外)祖父,祖母,则A,B是C的grandparent,C是A, ...
- 九度1035:找出直系亲属并查集
题目描述: 如果A,B是C的父母亲,则A,B是C的parent,C是A,B的child,如果A,B是C的(外)祖父,祖母,则A,B是C的grandparent,C是A,B的grandchild,如果A ...
- 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的 ...
- 找出两个字符串中最大子字符串,如abractyeyt,dgdsaeactyey的最大子串为actyet
// 最大子字符串.cpp : 定义控制台应用程序的入口点. // //找出两个字符串中最大子字符串,如"abractyeyt","dgdsaeactyey"的 ...
- 微软面试题系列(四):在二元树中找出和为某一值的所有路径
有了第一题作为基础,这一题写起来也相当简单.只是搜索的时候呢,可以剪枝一下.这个是搜索的技巧,用多了就自然有这个习惯了! 建树依然建立二元查找树,然后用深搜,用一个path数组把结点的值存储起来.用深 ...
- 在数组中找出3个数使得它们和为0
题目: 给定一个集合S,试找出3个数a, b, c,使得a+b+c=0.也即从集合中找出所有的和为0的3个数. 例如:集合S={-1,0, 1, 2, -1, 4},则满足条件的3个数有2对:(-1, ...
最新文章
- visual studio2010-2015编译部署caffe
- Java开发程序员最值得学习的10大技术
- Little Sub and Traveling
- 第一个MapReduce程序-------WordCount
- 1 | GNN基础理论
- C、C++语言中参数的压栈顺序
- 学无止境,我还在进步
- HTTP权威指南笔记
- PowerDesigner生成sql建表语句
- 8、(八)外汇基础篇之外汇期权交易
- 树莓派 python驱动蜂鸣器
- html5 竖线的实现,border 实现竖线
- 给定经纬度定位某个城市
- 我点美团为什么会显示服务器错误,美团服务器崩了 外卖App在部分区域出现了故障...
- Javascript中LenB的计算(ASP)
- K8S pod 时区设置
- 一个正确的编程学习方法
- ghost使用图解加详细说明
- 植物大战僵尸以及超级玛丽源码分享
- 浙江省计算机一级linux,浙江省大学计算机一级Linux及其浙江省大学计算机三级Linux网络管理及其应用.doc...
热门文章
- Android虚拟机的安装
- js操作图片像素进行编辑
- 360断网急救箱 dns服务器未响应,发现DNS服务异常,用360断网急救箱修复后过一段时间又复发。怎么办?...
- MFC中画出圆形按钮,告别方形普通按钮
- 京东获取商品历史价格信息 API接口
- 西南大学网络作业答案计算机,2019西南大学继续教育学院《计算机基础》作业答案...
- 华为钱包扫码云闪付_华为钱包、云闪付,NFC支付要这样使用!!!-已回复
- 彻底解决unable to find valid certification path to requested target
- 采用Matlab解决最小曼哈顿图问题
- python必背的英语单词怎么写_背英语单词的最好方法