题目描述:
    如果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. Java编程基础-字符串

    在Java语言中,字符串数据实际上由String类所实现的.Java字符串类分为两类:一类是在程序中不会被改变长度的不变字符串:另一类是在程序中会被改变长度的可变字符串.Java环境为了存储和维护这两 ...

  2. Sql 行转换为列 以及列转换为行的心得

    这是 创建数据库的脚本文件 CREATE TABLE [dbo].[stu]( [学号] [nvarchar](255) NOT NULL, [姓名] [nvarchar](255) NULL, [性 ...

  3. Window10 开启传统启动界面

    Windows 10沿袭了Windows 8的快速启动,导致在启动过程中无法通过按F8进入启动选项,这样当系统遇到问题无法进入时根本无法通过进入安全模式等方式进行处理(当然通过其他一些工具还是能够引导 ...

  4. 【工具篇】在.Net中实现HTML生成图片或PDF的几种方式

    前段时间由于项目上的需求,要在.Net平台下实现把HTML内容生成图片或PDF文件的功能,特意在网上研究了几种方案,这里记录一下以备日后再次使用.当时想着找一种开发部署都比较清爽并且运行稳定的方案,但 ...

  5. 如何写好一个vue组件,老夫的一年经验全在这了【转】 v-bind="$attrs" 和 v-on="$listeners"

    如何写好一个vue组件,老夫的一年经验全在这了 一个适用性良好的组件,一种是可配置项很多,另一种就是容易覆写,从而扩展功能 Vue 组件的 API 来自三部分——prop.事件和插槽: prop 允许 ...

  6. Springboot邮箱接口(使用个人邮箱发送邮件)

    近期项目使用邮件验证,这里使用个人邮箱进行测试,记录开发笔记 SpringBoot自带短信接口 maven pom.xml 引入: <dependency> <groupId> ...

  7. 基于Passthru的NDIS开发的个人理解

    这几天对NDIS的学习,基本思路是:首先熟悉理论知识→然后下载一个例子进行研究→最后例子自己模仿扩展→最最后尝试自己写一个新的. Passthru是微软NDIS自己写的一个框架驱动,NDIS开发者可以 ...

  8. 继上一篇随笔,优化3张以上图片轮播React组件

    import React from 'react'; import PropTypes from 'prop-types'; import {getSwipeWay} from '../utils/s ...

  9. javascript获取属性的两种方法及区别

    javascript获取属性有两种方式,点或者中括号: var obj={} obj.x=1 console.log(obj.x)//1 第一种方式,x是字面量 try{ console.log(ob ...

  10. HDU-1241-油藏

    这题一道深搜的简单题目,其实题目的思路就只是向八个方向搜索,然后把整个油田遍历一遍即可. #include <cstdio> #include <cstring> int ma ...