|  | 
		
			| 常用链接留言簿(4)随笔分类随笔档案搜索最新评论
	阅读排行榜评论排行榜Powered by: 博客园
 模板提供:沪江博客
 |  | 
		
			| | 
 | 
 | 
发新文章 | 
 |  | 
	
	
		
			计算Ted后代的年龄并排序 第一次用结构,居然一次AC了,很爽。。 运用递归查找相应节点的上一代年龄,没有则再向上查
  #include <iostream> 
  #include <string> 
  #include <vector> 
  #include <cmath> 
  using namespace std; 
  
  struct descedant 
    { 
  char father[20]; 
  char child[20]; 
  int age;    //child的年龄 
  int differ; 
  void init(); 
  }; 
  
  void descedant::init()   //初始化 
    { 
  age=0; 
  differ=0; 
  } 
  
  descedant des[100]; 
  
  void getAge(descedant& d,int n)    //递归计算出年龄 
    { 
  for (int j=0;j<n;j++) 
     { 
  if (strcmp(d.father,des[j].child)==0) 
     { 
  if (des[j].age==0)   //未计算则递归算上一代 
     { 
  getAge(des[j],n); 
  } 
  d.age=des[j].age-d.differ; 
  break; 
  } 
  } 
  } 
  
  int cmp(const void* a,const void* b)    //排序,年龄从大到小,若年龄相同则按字典顺序 
    { 
  descedant* c=(descedant*)a; 
  descedant* d=(descedant*)b; 
  if (c->age==d->age) 
  return strcmp(c->child,d->child); 
  return d->age-c->age; 
  } 
  int main() 
    { 
  int n,num,count=1; 
  scanf("%d",&n); 
  while (n--) 
     { 
  scanf("%d",&num); 
  int k=0; 
  for (int i=0;i<num;i++) 
     { 
  des[k].init(); 
  scanf("%s %s %d",des[k].father,des[k].child,&des[k].differ); 
  if (strcmp(des[k].father,"Ted")==0) 
     { 
  des[k].age=100-des[k].differ; 
  } 
  k++; 
  } 
  for (int i=0;i<num;i++) 
     { 
  if (des[i].age==0) 
     { 
  getAge(des[i],num); 
  } 
  } 
  qsort(des,num,sizeof(descedant),cmp); 
  printf("DATASET %d\n",count++); 
  for (int i=0;i<num;i++) 
     { 
  printf("%s %d\n",des[i].child,des[i].age); 
  } 
  } 
  } 
  
      
	    
    
 |  |