您的位置:首页 > 其它

题目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者的关系,如果没有直系关系,请输出-。

    具体含义和输出格式参见样例.

样例输入:
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("-");
}
}

}

}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: