题目
假设在周末舞会上,男士们和女士们进入舞厅时,各自排成一队。跳舞开始时,依次从男队和女队的队头各出一人配成舞伴。若两队初始人数不相同,则较长的那一队中未配对者等待下一轮舞曲。现要求写一算法模拟上述舞伴配对问题,输出配对情况。
思路
该题我们采用队列存储男舞伴和女舞伴的信息,分别定义一个男舞伴的队列和女舞伴的队列,按照性别对舞伴信息进行分别入队。在分配舞伴时,从队头开始,当两个队列都不为空时,男舞伴的队列和女舞伴的队列分别出队一人,组成舞伴。最后通过判断队列是否为空,来输出舞伴分配情况。
代码
#include<stdio.h>
#include<string.h>
#define MAXSIZE 1000 //队列大小
//存储舞伴信息的结构体
typedef struct{
char name[20];
char sex;
}Person;
//存储队列信息的结构体
typedef struct{
Person *person;
int front;//队头
int tail;//队尾
}Point;
Person man[MAXSIZE];//存储男舞伴的队列
Person woman[MAXSIZE];//存储女舞伴的队列
Point manPoint;//男舞伴队列的信息
Point womanPoint;//女舞伴队列的信息
void Init(); //初始化队列信息
void pushQueue(Point *p1,Person p2);//入队
void outQueue(Point*p1,char *name);//出队
void getHead(Point *p1,char *name);//获取队中首元素
void Dance();//分配舞伴
int main()
{
int n;
Person x;
printf("请输入跳舞的总人数:");
scanf("%d",&n);
printf("请输入跳舞的人的姓名和性别('F'为男性,'M为女性')\n");
Init();
//输入跳舞的人信息并对应入队
for(int i=0;i<n;i++){
scanf("%s %c",x.name,&x.sex);
if(x.sex=='F'){
pushQueue(&manPoint,x);
}else if(x.sex=='M'){
pushQueue(&womanPoint,x);
}
}
Dance();//分配舞伴
}
//初始化队列信息
void Init()
{
manPoint.person=man;
manPoint.front=0;
manPoint.tail=0;
womanPoint.person=woman;
womanPoint.front=0;
womanPoint.tail=0;
}
//入队
void pushQueue(Point *p1,Person p2)
{
if(p1->tail+1==p1->front) return;
p1->person[p1->tail++]=p2;
}
//出队
void outQueue(Point*p1,char *name)
{
if(p1->front==p1->tail) return;
strcpy(name,p1->person[p1->front++].name);
}
//获取队中首元素
void getHead(Point *p1,char *name)
{
strcpy(name,p1->person[p1->front].name);
}
//分配舞伴
void Dance()
{
char s1[20];
printf("已分配的舞伴:\n");
//分配舞伴并输出
while((manPoint.front!=manPoint.tail)&&(womanPoint.front!=womanPoint.tail)){
outQueue(&manPoint,s1);
printf("%s ",s1);
outQueue(&womanPoint,s1);
printf("%s\n",s1);
}
//判断是否还有人未分配舞伴,并记录下一次谁先分配到舞伴
int flag=0;
if(manPoint.front!=manPoint.tail){
flag=1;
getHead(&manPoint,s1);
}
if(womanPoint.front!=womanPoint.tail){
flag=1;
getHead(&womanPoint,s1);
}
if(flag){
printf("下一次分配舞伴时%s最先分配到舞伴",s1);
}else{
printf("当前舞伴正好完全分配!");
}
}