题目1035:找出直系亲属
2014-11-13 22:58
295 查看
题目1035:找出直系亲属
时间限制:1 秒
内存限制:32 兆
特殊判题:否
提交:1978
解决:796
题目描述:
如果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者的关系,如果没有直系关系,请输出-。
具体含义和输出格式参见样例.
样例输入:
样例输出:
参考代码: 第一版 拙劣的递归
版本2 参考网上解答,用了些小技巧
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.Scanner;
import org.omg.PortableInterceptor.SYSTEM_EXCEPTION;
public class Main {
public static void main(String arg[]){
Scanner sc = new Scanner(System.in);
while(sc.hasNext()){
int n = sc.nextInt();
int m = sc.nextInt();
if(m==0 && n==0) break;
int[] persons =new int[26];
Arrays.fill(persons, -1);
String rela1 = sc.nextLine();//读入回车
for(int i=0;i<n;i++)
{
String rela = sc.nextLine();
if(rela.charAt(1)!='-')
persons[rela.charAt(1)-65]=rela.charAt(0)-65;
if(rela.charAt(2)!='-')
persons[rela.charAt(2)-65]=rela.charAt(0)-65;
}
for(int i=0;i<m;i++){
String ask = sc.nextLine();
int ask1 = ask.charAt(0)-65;
int ask2 = ask.charAt(1)-65;
int count=0;
while (ask1!=ask2 && persons[ask1]!=-1 && ask1>=0 && ask1<26)
{
count++;
ask1 = persons[ask1];
}
if(ask1==ask2)
{
for(int j=count;j>=3;j--)
System.out.print("great-");
if(count>=2) System.out.println("grandparent");
else System.out.println("parent");
}
else {
ask1 = ask.charAt(0)-65;
ask2 = ask.charAt(1)-65;
count=0;
while (ask2!=ask1 && persons[ask2]!=-1 && ask2>=0 && ask2<26)
{
count++;
ask2 = persons[ask2];
}
if(ask1==ask2)
{
for(int j=count;j>=3;j--)
System.out.print("great-");
if(count>=2) System.out.println("grandchild");
else System.out.println("child");
}
else {
System.out.println("-");
}
}
}
}
}
}
时间限制:1 秒
内存限制:32 兆
特殊判题:否
提交:1978
解决:796
题目描述:
如果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 -
参考代码: 第一版 拙劣的递归
import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.Collections; import java.util.Scanner; import org.omg.PortableInterceptor.SYSTEM_EXCEPTION; class Person{ Person mother=null;; Person father=null;; Person child=null; char name; public Person(char name) { setName(name); } public Person(char name,Person father,Person mother) { setFather(father); setMother(mother); setName(name); } public Person(char name,Person child) { setChild(child); setName(name); } public void setName(char name) { // TODO Auto-generated constructor stub this.name = name; } public char getName() { // TODO Auto-generated constructor stub return this.name; } public Person getMother(){ return this.mother; } public Person getFather(){ return this.father; } public Person getChild(){ return this.child; } public void setMother(Person mother){ this.mother=mother; } public void setFather(Person father){ this.father=father; } public void setChild(Person child){ this.child=child; } } public class Main { public static void main(String arg[]){ Scanner sc = new Scanner(System.in); while(sc.hasNext()){ int n = sc.nextInt(); int m = sc.nextInt(); if(m==0 && n==0) break; String rela1 = sc.nextLine(); ArrayList<Person> persons = new ArrayList<Person>(); persons.clear(); for(int i=0;i<n;i++) { String rela = sc.nextLine(); Person person1; Person person2; Person person3; int ChildNum=NoFindPersons(rela.charAt(0),persons); int FatherNum=NoFindPersons(rela.charAt(1),persons); int MotherNum=NoFindPersons(rela.charAt(2),persons); if(ChildNum==-1) { person1 = new Person(rela.charAt(0)); persons.add(person1); } else{ person1 = persons.get(ChildNum); } if(rela.charAt(1)!='-'){ //System.out.println(rela); if(FatherNum==-1) { person2 = new Person(rela.charAt(1)); persons.add(person2); } else{ person2 = persons.get(FatherNum); } person2.setChild(person1); person1.setFather(person2); } if(rela.charAt(2)!='-'){ if(MotherNum==-1) { person3 = new Person(rela.charAt(2)); persons.add(person3); } else{ person3 = persons.get(MotherNum); } person3.setChild(person1); person1.setMother(person3); } } for(int i=0;i<m;i++){ String ask = sc.nextLine(); int count1=0; int flag1 = -1; int flag2 = -1; for(int j=0;j<persons.size();j++){ //System.out.println(persons.get(j).getName()); if(persons.get(j).getName()==ask.charAt(1)) { flag1 = FindParents(persons.get(j),ask.charAt(0),count1); //System.out.println(flag1); } if(persons.get(j).getName()==ask.charAt(0)) { flag2 = FindParents(persons.get(j),ask.charAt(1),count1); //System.out.println(flag2); } } if(flag1==-1 && flag2==-1) System.out.println("-"); else if(flag1!=-1 && flag2==-1) { if(flag1==1) System.out.println("parent"); else if(flag1==2) System.out.println("grandparent"); else { for(int k=0;k<flag1-2;k++) System.out.print("great-"); System.out.print("grandparent"); System.out.println(); } } else { if(flag2==1) System.out.println("child"); else if(flag2==2) System.out.println("grandchild"); else { for(int k=0;k<flag2-2;k++) System.out.print("great-"); System.out.print("grandchild"); System.out.println(); } } } } } private static int NoFindPersons(char charAt,ArrayList<Person> persons) { // TODO Auto-generated method stub int flag = -1; for(int i=0;i<persons.size();i++) if(persons.get(i).getName()==charAt) flag=i; return flag; } public static int FindParents(Person sour, char aim, int count1) { count1++; if (sour.getFather()!=null) { if(sour.getFather().getName()==aim) return count1; else { int k = FindParents(sour.getFather(), aim, count1); if(k!=-1) return k; } } if (sour.getMother()!=null) { if(sour.getMother().getName()==aim) return count1; else { int k = FindParents(sour.getMother(), aim, count1); if(k!=-1) return k; } } return -1; } }
版本2 参考网上解答,用了些小技巧
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.Scanner;
import org.omg.PortableInterceptor.SYSTEM_EXCEPTION;
public class Main {
public static void main(String arg[]){
Scanner sc = new Scanner(System.in);
while(sc.hasNext()){
int n = sc.nextInt();
int m = sc.nextInt();
if(m==0 && n==0) break;
int[] persons =new int[26];
Arrays.fill(persons, -1);
String rela1 = sc.nextLine();//读入回车
for(int i=0;i<n;i++)
{
String rela = sc.nextLine();
if(rela.charAt(1)!='-')
persons[rela.charAt(1)-65]=rela.charAt(0)-65;
if(rela.charAt(2)!='-')
persons[rela.charAt(2)-65]=rela.charAt(0)-65;
}
for(int i=0;i<m;i++){
String ask = sc.nextLine();
int ask1 = ask.charAt(0)-65;
int ask2 = ask.charAt(1)-65;
int count=0;
while (ask1!=ask2 && persons[ask1]!=-1 && ask1>=0 && ask1<26)
{
count++;
ask1 = persons[ask1];
}
if(ask1==ask2)
{
for(int j=count;j>=3;j--)
System.out.print("great-");
if(count>=2) System.out.println("grandparent");
else System.out.println("parent");
}
else {
ask1 = ask.charAt(0)-65;
ask2 = ask.charAt(1)-65;
count=0;
while (ask2!=ask1 && persons[ask2]!=-1 && ask2>=0 && ask2<26)
{
count++;
ask2 = persons[ask2];
}
if(ask1==ask2)
{
for(int j=count;j>=3;j--)
System.out.print("great-");
if(count>=2) System.out.println("grandchild");
else System.out.println("child");
}
else {
System.out.println("-");
}
}
}
}
}
}
相关文章推荐
- 题目1035:找出直系亲属 树
- 题目1035:找出直系亲属
- 题目1035:找出直系亲属
- 九度OJ题目1035:找出直系亲属
- 题目1035:找出直系亲属(树的深度)
- 九度OJ 题目1035:找出直系亲属
- 九度OJ题目1035:找出直系亲属
- [Jobdu] 题目1035:找出直系亲属
- 九度OJ-题目1035 找出直系亲属
- 题目1035:找出直系亲属
- 题目1035:找出直系亲属
- 九度oj 题目1035:找出直系亲属 【ZJU2009考研机试题5】
- 题目1035:找出直系亲属
- 题目1035:找出直系亲属
- 题目1035:找出直系亲属
- 【九度OJ】题目1035:找出直系亲属
- 题目1035:找出直系亲属
- 题目1035:找出直系亲属
- 九度OJ 1035:找出直系亲属(二叉树)
- 1035_找出直系亲属