题目1035:找出直系亲属
参考代码: 第一版 拙劣的递归
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("-");
}
}
}
}
}
}