题目1035:找出直系亲属

题目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("-");
					}
				}
		
			}
			
			
		}
	}
}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值