求这个c语言题目的解题思路和解法?
2003年突发的非典型肺炎(SARS)是一种病源还不完全了解的新型传染病,需要隔离所有疑似病例。在N大学,有许多学生团体,一个学生可以加入多个团体,同一个学生团体内部成员...
2003年突发的非典型肺炎(SARS)是一种病源还不完全了解的新型传染病,需要隔离所有疑似病例。在N大学,有许多学生团体,一个学生可以加入多个团体,同一个学生团体内部成员被认为是经常接触的。N大学为了应付SARS,规定若一个学生被认为是疑似病例,则他所在团体的所有学生都被认为是疑似病例。现在需要你编写一个程序,在发现一个学生是疑似病例后,找到所有与之直接或间接接触过的疑似病例。可以设每一名学生用数字0到n-1编号,输入有学生总数n,学生团体数k,每个学生团体的人数和成员的编号,可能是SARS疑似病例的学生编号,输出所有找到的疑似病例学生编号。例如,
输入数据如下:
1004 //100名学生,4个学生团体;
2 1 2 //第一个学生团体有2人,是编号1和2的两位学生,以下三个团体类似;
5 10 13 11 12 14
2 0 1
2 99 2
0 //现在发现编号0的学生是疑似病例。
这时应输出如下:
4,0,1,2,99表示发现有4位疑似病例,是编号是0,1,2,99的
尽量多注释每个步骤,我是个菜鸟。
求解整个算法 展开
输入数据如下:
1004 //100名学生,4个学生团体;
2 1 2 //第一个学生团体有2人,是编号1和2的两位学生,以下三个团体类似;
5 10 13 11 12 14
2 0 1
2 99 2
0 //现在发现编号0的学生是疑似病例。
这时应输出如下:
4,0,1,2,99表示发现有4位疑似病例,是编号是0,1,2,99的
尽量多注释每个步骤,我是个菜鸟。
求解整个算法 展开
展开全部
解题思路:
1.采用二维数组(int型)存放所有学生编号,一行为一个团体。
2.用一个一维数组存放所有疑似病的学生编号
3.按编号查询所有团体的学生,
4.查找到后,即将该行所有编号存入2.中的数组
5.输出2.中的数组即可。
编写程序时,第4.和5.采用递归调用。
程序如下(该程序已经在WIN-TC上通过)
#include<stdio.h>
#include<stdlib.h>
#define N 100 /*学生总人数的最高限制数额*/
#define M 10 /*团体的个数的最高限制数额*/
#define S 10 /*团体的人数的最高限额*/
int num[S+1]; /*存放疑似病历的学生编号*/
int count; /*累计有疑似病历学生的数量*/
void findnumber(int k,int groupn,int a[][S+1])/*查找并保存所有关联学生编号*/
{
int i,j,flag;
int da[S],tem,n;
for(i=0;i<groupn;i++) /*对每个团体做如下操作*/
{
if(a[i][1]<0)continue;/*表示对已经确定的团体不再重复操作*/
tem=a[i][0];
flag=0;
for(j=1;j<=tem;j++) /*搜索团体的每一个编号,看是否与欲查编号k是否相符*/
if(a[i][j]==k)
{
flag=1; /*如果相符则记flag为1,以作为下面操作的条件*/
break;
}
if(flag) /*flag不为零则表示该团体包含疑似病的学生编号,进行如下的操作:*/
{
for(j=1;j<=tem;j++) /*将该团体的所有编号保存*/
{
da[j-1]=a[i][j];
for(n=0;n<count;n++) /*这一循环是为了保证已经记录过的编号不再重复录入*/
{
if(num[n]==a[i][j])
{
n=-1;break;
}
}
if(n>=0)num[count++]=a[i][j];
a[i][j]=-1; /*对已经确定的团体在保存后赋负值,以便后面不再重复*/
}
for(j=0;j<tem;j++)
findnumber(da[j],groupn,a); /*对该团体的其他编号再一次递归调用*/
}
}
}
main()
{
int students[N],number[M],data[M][S+1];
int studentsum,groupsum,i,j,k;
char str[10];
/*输入学生总人数和团体的个数*/
scanf("%d %d",&studentsum,&groupsum);
/*输入每个团体的学生的编号*/
for(i=0;i<groupsum;i++)
{
printf("NO.%d:(输入y或Y结束)\n",i+1);/*提示以下对第i个团体进行录入*/
scanf("%d",&data[i][0]); /*输入团体包含的人数*/
for(j=1;j<=S;j++) /*录入一个团体的每个学生的编号*/
{
scanf("%s",str);
if(stricmp(str,"y")==0)break; /*检查是否输入了y 或Y,如是则表示本团体录入完成*/
data[i][j]=atoi(str);
}
}
/*输入第一个疑似病的学生编号*/
printf("numbering=");
scanf("%d",&k);
/*以下开始查找*/
count=0; /*记数器初始化清零*/
findnumber(k,groupsum,data);/*采用递归函数找所有相关联的团体的学生编号*/
/*将查找结果输出*/
printf("\n%d ",count); /*先输出所有有关联的学生的总数*/
for(i=0;i<count;i++) /*在总数后面罗列所有编号*/
printf("%d ",num[i]);
getch(); /*显示结束后,等待按任意键后程序*/
return 0;
}
1.采用二维数组(int型)存放所有学生编号,一行为一个团体。
2.用一个一维数组存放所有疑似病的学生编号
3.按编号查询所有团体的学生,
4.查找到后,即将该行所有编号存入2.中的数组
5.输出2.中的数组即可。
编写程序时,第4.和5.采用递归调用。
程序如下(该程序已经在WIN-TC上通过)
#include<stdio.h>
#include<stdlib.h>
#define N 100 /*学生总人数的最高限制数额*/
#define M 10 /*团体的个数的最高限制数额*/
#define S 10 /*团体的人数的最高限额*/
int num[S+1]; /*存放疑似病历的学生编号*/
int count; /*累计有疑似病历学生的数量*/
void findnumber(int k,int groupn,int a[][S+1])/*查找并保存所有关联学生编号*/
{
int i,j,flag;
int da[S],tem,n;
for(i=0;i<groupn;i++) /*对每个团体做如下操作*/
{
if(a[i][1]<0)continue;/*表示对已经确定的团体不再重复操作*/
tem=a[i][0];
flag=0;
for(j=1;j<=tem;j++) /*搜索团体的每一个编号,看是否与欲查编号k是否相符*/
if(a[i][j]==k)
{
flag=1; /*如果相符则记flag为1,以作为下面操作的条件*/
break;
}
if(flag) /*flag不为零则表示该团体包含疑似病的学生编号,进行如下的操作:*/
{
for(j=1;j<=tem;j++) /*将该团体的所有编号保存*/
{
da[j-1]=a[i][j];
for(n=0;n<count;n++) /*这一循环是为了保证已经记录过的编号不再重复录入*/
{
if(num[n]==a[i][j])
{
n=-1;break;
}
}
if(n>=0)num[count++]=a[i][j];
a[i][j]=-1; /*对已经确定的团体在保存后赋负值,以便后面不再重复*/
}
for(j=0;j<tem;j++)
findnumber(da[j],groupn,a); /*对该团体的其他编号再一次递归调用*/
}
}
}
main()
{
int students[N],number[M],data[M][S+1];
int studentsum,groupsum,i,j,k;
char str[10];
/*输入学生总人数和团体的个数*/
scanf("%d %d",&studentsum,&groupsum);
/*输入每个团体的学生的编号*/
for(i=0;i<groupsum;i++)
{
printf("NO.%d:(输入y或Y结束)\n",i+1);/*提示以下对第i个团体进行录入*/
scanf("%d",&data[i][0]); /*输入团体包含的人数*/
for(j=1;j<=S;j++) /*录入一个团体的每个学生的编号*/
{
scanf("%s",str);
if(stricmp(str,"y")==0)break; /*检查是否输入了y 或Y,如是则表示本团体录入完成*/
data[i][j]=atoi(str);
}
}
/*输入第一个疑似病的学生编号*/
printf("numbering=");
scanf("%d",&k);
/*以下开始查找*/
count=0; /*记数器初始化清零*/
findnumber(k,groupsum,data);/*采用递归函数找所有相关联的团体的学生编号*/
/*将查找结果输出*/
printf("\n%d ",count); /*先输出所有有关联的学生的总数*/
for(i=0;i<count;i++) /*在总数后面罗列所有编号*/
printf("%d ",num[i]);
getch(); /*显示结束后,等待按任意键后程序*/
return 0;
}
展开全部
你只要思路?可以使用图结构,邻接表存储方式。把数据处理好以后,一旦输出某个编号,然后找到对应编号,对图进行深度搜索。可以使用深度优先,广度优先也可以。
不知道你这是用于什么的,要说出具体来源才好针对性根据要求写代码或提供更多思路。
----------------------------------------------------------------------------------------------------------------------------------
************************二次回答***********************************************
楼主也不追问一下,你追问了,回答的才知道是否还有回答的必要。
下面的程序大致能实现,但是还是不清楚你程序的用途,比如是什么自测平台的话还得看输入输出格式,其它的话还得增加对错误的判断,比如内存申请失败,内存是否多余等等。
程序见附件。
本回答被网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询