L2-007 家庭房产 (25 分) C语言递归

题目描述

给定每个人的家庭成员和其自己名下的房产,请你统计出每个家庭的人口数、人均房产面积及房产套数。

输入格式:

输入第一行给出一个正整数N(≤1000),随后N行,每行按下列格式给出一个人的房产:

编号 父 母 k 孩子1 … 孩子k 房产套数 总面积
其中编号是每个人独有的一个4位数的编号;父和母分别是该编号对应的这个人的父母的编号(如果已经过世,则显示-1);k(0≤k≤5)是该人的子女的个数;孩子i是其子女的编号。

输出格式:

首先在第一行输出家庭个数(所有有亲属关系的人都属于同一个家庭)。随后按下列格式输出每个家庭的信息:

家庭成员的最小编号 家庭人口数 人均房产套数 人均房产面积
其中人均值要求保留小数点后3位。家庭信息首先按人均面积降序输出,若有并列,则按成员编号的升序输出。

输入样例:

10
6666 5551 5552 1 7777 1 100
1234 5678 9012 1 0002 2 300
8888 -1 -1 0 1 1000
2468 0001 0004 1 2222 1 500
7777 6666 -1 0 2 300
3721 -1 -1 1 2333 2 150
9012 -1 -1 3 1236 1235 1234 1 100
1235 5678 9012 0 1 50
2222 1236 2468 2 6661 6662 1 300
2333 -1 3721 3 6661 6662 6663 1 100

输出样例:

3
8888 1 1.000 1000.000
0001 15 0.600 100.000
5551 4 0.750 100.000

虽然过了,但感觉还是有许多细节没处理好,若有见解,欢迎指点哈!

#include<stdio.h>
#include<string.h>
int a[1010][100],n;
void putfun(int a[][2],double b[][2],int m,int j)//每次只输出最大的数,毁掉原来最大数 
{
    int i,t;
    for(i=1;i<m;i++)
    {
	    if(b[i][1]>b[j][1]&&b[i][1]!=-1)j=i;
		else if(b[i][1]==b[j][1]&&a[i][1]>a[j][1])j=i;//特殊情况处理 
		   
	}
	printf("%04d %d %.3lf %.3lf\n",a[j][0],a[j][1],b[j][0],b[j][1]);
	b[j][1]=-1;
}
int rfun(int a[],int s)//求出家庭的人数 
{
    int i,j,k; 
    for(i=0;i<s;i++)
      for(j=i+1;j<s;j++)
        if(a[j]==a[i])
        {
          for(k=j+1;k<s;k++)a[k-1]=a[k];
          s--;
        }   
    return s;
}
void pfun(int num,int k)//递归求出几个家族 
{
   int i,j,x;
   for(i=0;i<n;i++)
     for(j=2;j<a[i][1]-2;j++)
	    if(a[i][j]==num&&j!=5&&a[i][j]!=-1&&a[i][0]==0)
		{	 
		    a[i][0]=k;
            for(x=2;x<a[i][1]-2;x++)
	          if(x!=5&&a[i][x]!=-1)pfun(a[i][x],k);
		}
}
int main()
{
    int i,j,count,k=0,min=10000,s,sumF,sumS;
    int rnum[1010],ren[1010][2];
    double ave[1010][2];
	scanf("%d",&n);
    for(i=0;i<n;i++)
    {
       j=0;	
       a[i][0]=0;
	   scanf("%d %d %d",&a[i][2],&a[i][3],&a[i][4]);
	   scanf("%d",&a[i][5]);     //儿子的个数
	   j=6;
	   count=a[i][5];
	   while(count)
	   {
	      scanf("%d",&a[i][j++]);
	      count--;
	   } 
	   scanf("%d %d",&a[i][j],&a[i][j+1]);
	   a[i][1]=j+2;
    }
    k=0;//家族数目K 
    for(i=0;i<n;i++)if(a[i][0]==0){k++;pfun(a[i][2],k);}
    printf("%d\n",k);
    for(count=1;count<=k;count++)
	{
	  min=10000;
	  memset(rnum,0,sizeof(rnum)); 
	  sumF=sumS=s=0;
      for(i=0;i<n;i++)
      {
	    if(a[i][0]==count)
	    {
		   for(j=2;j<a[i][1]-2;j++)
	          if(j!=5&&a[i][j]!=-1)
	          {
	             if(a[i][j]<min)min=a[i][j];
	             rnum[s++]=a[i][j];
	          }
	          sumF+=a[i][a[i][1]-2];
	          sumS+=a[i][a[i][1]-1];
		}
      } 
 	  ren[count][0]=min;                   //家庭成员的最小编号 
 	  ren[count][1]=rfun(rnum,s);          //家庭人口数 
 	  ave[count][0]=sumF*1.0/ren[count][1];//人均房产套数 
 	  ave[count][1]=sumS*1.0/ren[count][1];//人均房产面积 
    }
    for(i=1;i<=k;i++)putfun(ren,ave,count,i);
    return 0;
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

木木不会

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值