1050: 找出直系亲属

Posted 知我者,足以

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了1050: 找出直系亲属相关的知识,希望对你有一定的参考价值。

1050: 找出直系亲属

时间限制: 1 Sec  内存限制: 128 MB
提交: 321  解决: 264
[提交][状态][讨论版]

题目描述

 如果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
-


#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
using namespace std;
char cmp(char a,char b){
return a<b?0:1;
}
int main(){
int m,n;
while(cin>>m>>n&&(m!=0&&n!=0)){
string str[m];
for(int i=0;i<m;i++){
cin>>str[i];
}
char wt[n][2];
for(int i=0;i<n;i++){
for(int j=0;j<2;j++){
cin>>wt[i][j];
}
}
for(int i=0;i<n;i++){
int temp=0,index=0;
int j=m-1;
int count=0;
if(wt[i][1]<wt[i][0]){index=1;};
sort(wt[i],wt[i]+2,cmp);
while(j>=0){
if(str[j].find(wt[i][0])!=string::npos){
count++;
wt[i][0]=str[j][0];
}
if(wt[i][1]==str[j][0]) {temp=j;break;}
j--;
}
if(wt[i][1]!=str[temp][0]) count=0;
if(index==1){
while(count>2){
cout<<"great-";
count--;
}
if(count==2)
cout<<"grandparent"<<endl;
if(count==1)
cout<<"parent"<<endl;
if(count==0)
cout<<"-"<<endl;
}
else{
while(count>2){
cout<<"great-";
count--;
}
if(count==2)
cout<<"grandchild"<<endl;
if(count==1)
cout<<"child"<<endl;
if(count==0)
cout<<"-"<<endl;
}
}
}
return 0;
}

 

以上是关于1050: 找出直系亲属的主要内容,如果未能解决你的问题,请参考以下文章

找出直系亲属(树)

1035.找出直系亲属(floyd)

1050: [HAOI2006]旅行comf

如何找出前一个片段正在使用导航组件

找出当前显示的片段是啥的最佳方法是啥?

在一个无序整数数组中,找出连续增长片段最长的一段, 增长步长是1。Example: [3,2,4,5,6,1,9], 最长的是[4,5,6]