题目
找出直系亲属
代码和分析
import java.util.Arrays;
import java.util.Scanner;
/*
* 题意上,类似树,这里左节点和右节点是根节点的双亲。
* 用了并查集。
* 这里并查集的parent向量,记录的仍是该点所在树的父节点。
* */
public class Main {
private static int parent[];
private static int n=0;
private static int m=0;
//预处理:每个点为一个树,该点即为根子树
public static void preProcess(){
for(int i=0;i<26;i++){
parent[i]=i;
}
}
//寻找x的后代y隔了几代(即x的祖先节点是否有y)
public static int getDisc(int x,int y){
int distance=0;
while(x!=y && parent[x]!=x){
distance++;
x=parent[x];
}
if(x==y) return distance;
else return 0;
}
public static void main(String[] args){
Scanner scan=new Scanner(System.in);
while(scan.hasNext()){
int n=scan.nextInt();
int m=scan.nextInt();
if(n==0 && m==0) break;
parent=new int[26];
preProcess();
for(int i=0;i<n;i++){
String str=scan.next();
int child=str.charAt(0)-'A';
if(str.charAt(1)!='-') parent[str.charAt(1)-'A']=child;;
if(str.charAt(2)!='-') parent[str.charAt(2)-'A']=child;
}
for(int i=0;i<m;i++){
String str=scan.next();
int person1=str.charAt(0)-'A';
int person2=str.charAt(1)-'A';
int distance=getDisc(person1,person2);
if(distance!=0){ //person1为长辈,person2为后代
if(distance==1){
System.out.println("parent");
}else if(distance==2){
System.out.println("grandparent");
}else{
for(int k=2;k<distance;k++){
System.out.print("great-");
}
System.out.println("grandparent");
}
}else{ //person2为长辈,person1为后代
distance=getDisc(person2,person1);
if(distance==0){
System.out.println("-");
}else if(distance==1){
System.out.println("child");
}else if(distance==2){
System.out.println("grandchild");
}else{
for(int k=2;k<distance;k++){
System.out.print("great-");
}
System.out.println("grandchild");
}
}
}
}
scan.close();
}
}