该题是的题意:
输入一组数据,包括某个人的人名和他父亲的名字,以及他出生时他父亲的年龄,这些人都是Ted的后代,现在要你整理这些数据,按年龄大小输出这个家族的成员,如果某些成员年龄相同,按照字母的顺序输出;
解题思路:
1.首先构造两个结构体,一个是people{ int bornage;char father[100];char child[100]; }
其中father用来存放他父亲的名字,child用来放他自己的名字,创建一个people类型结构体数组a[110];
另一个结构体是name{int age;char pepname[100]};其中age表示一个人的年龄,pepname表示一个人的姓名;
创建一个name类型的结构体数组b[100];
2.输入数据,再输入数据的过程中遇到father=Ted的数据时,就把此人的姓名放入b[++k].pepname中,k的初始值是0,b[k].age=100-a[i].bornage;(输入数据是存放在a中的)
3.用两层循环来生成家族树;
for(j=1;j<=n;j++)
for(i=1;i<=n;i++)
{
如果a[i].father=b[j].pepname;//说明a[i]是b[j]的儿子;
b[++k].pepname=a[i].child;
b[k].age=|b[j].age-a[i].bornage|;
}
4.对这些成员按年龄大小排序,年龄相同的就按名字的大小排序;
5.输出这些家族的成员即可。
代码实现:
#include<iostream>
#include<math.h>
#include<algorithm>
#include<string>
using namespace std;
struct people
{
char father[100];
char child[100];
int bornage;
}a[1100];
struct name
{
char pepname[100];
int age;
}b[1100];
bool cmp(const name &n1,const name &n2)
{
if(n1.age==n2.age)
return (strcmp(n1.pepname,n2.pepname)<0);
return n1.age>n2.age;
}
int main()
{
int k,rel,i,j,n;
int cases=1;
scanf("%d",&rel);
while(rel--)
{
scanf("%d",&n);
k=0;
strcpy(b[0].pepname,"Ted");
b[0].age=100;
for(i=1;i<=n;i++)
{
scanf("%s%s%d",a[i].father,a[i].child,&a[i].bornage);
if(strcmp(a[i].father,"Ted")==0)
{
strcpy(b[++k].pepname,a[i].child);
b[k].age=100-a[i].bornage;
}
}
printf("DATASET %d/n",cases++);
for(j=1;j<=n;j++)
for(i=1;i<=n;i++)
{
if(strcmp(b[j].pepname,a[i].father)==0)
{
strcpy(b[++k].pepname,a[i].child);
b[k].age=abs(b[j].age-a[i].bornage);
}
}
sort(b+1,b+k+1,cmp);
cout<<b[1].pepname<<" "<<b[1].age<<endl;
for(i=2;i<=k;i++)
if(strcmp(b[i].pepname,b[i-1].pepname)!=0)
cout<<b[i].pepname<<" "<<b[i].age<<endl;
}
return 0;
}