题目描述:
    如果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的关系。
    当n和m为0时结束输入。
输出:
    如果询问的2个人是直系亲属,请按题目描述输出2者的关系,如果没有直系关系,请输出-。
    具体含义和输出格式参见样例.
样例输入:
3 2
ABC
CDE
EFG
FA
BE
0 0
样例输出:
great-grandparent
-
 #include <cstdio>
#include <cstdlib>
#include <cstring>
#include <string>
#include <algorithm>
#define MIN -999999
int father[];
int mother[]; char temp[]; int relation[][]; int find(int p, int q) {
if(father[p] == q) {
return ;
}
if(mother[p] == q) {
return ;
}
if(relation[p][q] != MIN) {
return relation[p][q];
}
if(father[p] != -) {
int ansf = find(father[p],q);
if(ansf != ) {
relation[p][q] = + ansf;
return + ansf;
}
}
if(mother[p] != -) {
int ansm = find(mother[p],q);
if(ansm != ) {
relation[p][q] = + ansm;
return + ansm;
}
}
return ; } void prinfop(int n) {
if(n == ) {
puts("-");
}
else if(n == ) {
puts("parent");
}
else if(n == ) {
puts("grandparent");
}
else {
for(int i = ; i < n; i++) {
printf("%s","great-");
}
puts("grandparent");
}
} void prinfoc(int n) {
if(n == ) {
puts("-");
}
else if(n == ) {
puts("child");
}
else if(n == ) {
puts("grandchild");
}
else {
for(int i = ; i < n; i++) {
printf("%s","great-");
}
puts("grandchild");
}
}
int main(int argc, char const *argv[])
{
int n, m;
//freopen("input.txt","r",stdin);
scanf("%d %d",&n, &m);
while(!(n == && m == )) {
for(int i = ; i < ; i++) {
father[i] = -;
mother[i] = -;
for(int j = ; j < ; j++) {
relation[i][j] = MIN;
}
}
for(int i = ; i < n; i++) {
scanf("%s",temp);
if(temp[] == '-') {
continue;
}
int child = temp[] - 'A';
if(temp[] != '-') {
int fa = temp[] - 'A';
father[child] = fa;
relation[child][fa] = ;
}
if(temp[] != '-') {
int ma = temp[] - 'A';
mother[child] = ma;
relation[child][ma] = ;
} }
for(int i = ; i < m; i++) {
scanf("%s",temp);
if(temp[] == '-' || temp[] == '-') {
puts("-");
continue;
}
int p1 = temp[] - 'A';
int p2 = temp[] - 'A';
int ans1 = find(p1, p2);
if(ans1 == ) {
int ans2 = find(p2,p1);
prinfop(ans2);
}
else {
prinfoc(ans1);
}
}
scanf("%d %d",&n, &m); }
return ;
}

这道题用了二叉树的遍历和动态规划的思想,最重要的是一遍通过了(忽略第一次忘记注释freopen),开心!

九度oj 题目1035:找出直系亲属的更多相关文章

  1. 九度OJ 1256:找出两个只出现了一次的数字 (位运算)

    时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:568 解决:186 题目描述: 一个整型数组里除了两个数字之外,其他的数字都出现了两次.请写程序找出这两个只出现一次的数字. 输入: 输入的 ...

  2. 九度oj 1407 快速找出最小数

    原题链接:http://ac.jobdu.com/problem.php?pid=1407 线段树,区间更新,查询区间最小值. 注意区间更新,查询的时候,区间$\begin{align*}[L,R] ...

  3. hdu 1284 关于钱币兑换的一系列问题 九度oj 题目1408:吃豆机器人

    钱币兑换问题 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Sub ...

  4. 九度oj题目&amp;吉大考研11年机试题全解

    九度oj题目(吉大考研11年机试题全解) 吉大考研机试2011年题目: 题目一(jobdu1105:字符串的反码).    http://ac.jobdu.com/problem.php?pid=11 ...

  5. 九度oj 题目1007:奥运排序问题

    九度oj 题目1007:奥运排序问题   恢复 题目描述: 按要求,给国家进行排名. 输入:                        有多组数据. 第一行给出国家数N,要求排名的国家数M,国家号 ...

  6. 九度OJ 题目1384:二维数组中的查找

    /********************************* * 日期:2013-10-11 * 作者:SJF0115 * 题号: 九度OJ 题目1384:二维数组中的查找 * 来源:http ...

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

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

  8. 九度OJ题目1105:字符串的反码

    tips:scanf,cin输入字符串遇到空格就停止,所以想输入一行字符并保留最后的"\0"还是用gets()函数比较好,九度OJ真操蛋,true?没有这个关键字,还是用1吧,还是 ...

  9. 九度oj题目1009:二叉搜索树

    题目描述: 判断两序列是否为同一二叉搜索树序列 输入:                        开始一个数n,(1<=n<=20) 表示有n个需要判断,n= 0 的时候输入结束. 接 ...

随机推荐

  1. Android 权限的实现

    1.    权限 每个程序在安装时都有建立一个系统ID,如app_15,用以保护数据不被其它应用获取.Android根据不同的用户和组,分配不同权限,比如访问SD卡,访问网络等等.底层映射为Linux ...

  2. linux服务器上的jenkins远程触发构建windows server 2012服务器上的jenkins任务

    本文来自:https://blog.csdn.net/huashao0602/article/details/53318295  非常感谢原博主,亲测可行,这是我做CI持续集成试过的第6套方案了! 背 ...

  3. 【排序】插入排序:最稳定:时间复杂度O(n^2)

    想象着自己在玩扑克的时候抓牌,每抓到一张牌,按照从小到大的顺序排序. 如果第二张的点数小于第一张,就交换这两张牌,默认每次抓牌之前,前面的已经排好序了. 再来一张牌,与第二张比较,如果小于第二张,交换 ...

  4. 电脑连接海信电视 HDMI

    注意:我们家的电视是海信的,所以不能代表所有的电视哦~~~ 家里电视有线电视已经过期很长时间了,早就想把电脑连接到电视上用电视做显示器的心了,今天来兴趣了,就弄了一下!!! 用电脑连接电视需要先解决两 ...

  5. codevs 1390 回文平方数 USACO

    时间限制: 1 s  空间限制: 128000 KB  题目等级 : 青铜 Bronze 题目描述 Description 回文数是指从左向右念和从右像做念都一样的数.如12321就是一个典型的回文数 ...

  6. ubuntu16 安装elasticsearch6.3问题

    1.ubuntu16 安装elasticsearch6.3 elasticsearch 6.3需要的java的版本是1.8以上 安装java1.8 详见本博客的安装java https://www.c ...

  7. Linux下文件以及文件名编码转换

    1.查看文件编码方式--file 文件名(但不是很准确) yang@mint-linux ~ $ file baidu.html baidu.html: HTML document, UTF-8 Un ...

  8. WPF中做出一个QQ登陆界面

    Xaml: <Window x:Class="ChatSoftware.MainWindow" xmlns="http://schemas.microsoft.co ...

  9. CPP-基础:运算符重载详解

    1.运算符重载定义: C++中预定义的运算符的操作对象只能是基本数据类型.但实际上,对于许多用户自定义类型(例如类),也需要类似的运算操作.这时就必须在C++中重新定义这些运算符,赋予已有运算符新的功 ...

  10. ext笔记

    命名   The top-level namespaces and the actual class names should be CamelCased. Everything else shoul ...