【问题描述】周末舞会上,男生和女生们分别进入舞厅,各自排成一队。假设每首舞曲只能有一名男生一名女生跳舞,跳舞开始,依次从男队和女队队头各取一人配成舞伴,若两队初始人数不同,则较长那一队未配对者等待下一轮舞曲。配对成功的舞伴跳完舞排回各自队伍的最后。现要求写一算法模拟上述舞伴配对问题。
【输入形式】第一行输入两个整数n和k,n(n<1000)表示入场人数,k表示舞曲数。接下来n行输入n个人的姓名和性别(姓名中间无空格),姓名和性别用空格分隔。
【输出形式】成功配对则依次输出每首舞曲配对跳舞的男生姓名和女生姓名,姓名之间以空格分隔,不能成功配对(男生队或女生队无人)则输出“error”。
【样例输入1】
5 5
Tom m
John m
Alice f
Jenny f
Mary f
【样例输出1】
Tom Alice
John Jenny
Tom Mary
John Alice
Tom Jenny
#include<stdio.h>
#include<malloc.h>
#define ERROR 0
#define OK 1
#define MAXQSIZE 1000
typedef struct {
char name[20];//姓名
char sex;//性别
}Person;
typedef Person ElemType;
typedef struct
{
ElemType *base;
int front;
int rear;
}SqQueue;
int InitQueue(SqQueue *Q)
{
Q->base=(ElemType *)malloc(MAXQSIZE*sizeof(ElemType));
if(!Q->base)
return ERROR;
Q->front=Q->rear=0;
return OK;
}/*InitQueue*/
/*队列长度*/
int QueueLength(SqQueue *Q)
{
return (Q->rear-Q->front+MAXQSIZE)%MAXQSIZE;
}/*QueueLentgh*/
/*入队*/
int EnQueue(SqQueue *Q,ElemType e)
{
if((Q->rear+1)%MAXQSIZE==Q->front)
return ERROR;
Q->base[Q->rear]=e;
Q->rear=(Q->rear+1)%MAXQSIZE;
return OK;
}/*EnQuese*/
/*出队*/
int DeQueue(SqQueue *Q,ElemType *e)
{
if(Q->front==Q->rear)
return ERROR;
*e=Q->base[Q->front];
Q->front=(Q->front+1)%MAXQSIZE;
return OK;
}/*DeQueue*/
/*判队列是否为空*/
int QueueEmpty(SqQueue *Q)
{
if(Q->front==Q->rear)
return OK;
else
return ERROR;
}/*QueueEmpty*/
/*取对头*/
int GetHead(SqQueue *Q,ElemType *e)
{
if(Q->front==Q->rear)
return ERROR;
*e=Q->base[Q->front];
return OK;
}/*GetHead*/
/*释放队列*/
int DestroyQueue(SqQueue *Q)
{
if(Q->base)
{
Q->rear=Q->front=0;
free(Q->base);
}
return OK;
}/*DestroyQueue*/
int dancePartner(int n, int k)
{
Person m, f, s;
SqQueue Qm, Qf;
if (!InitQueue(&Qm) || !InitQueue(&Qf))
return ERROR;
int i, j;
for (i = 0, j = 0; i < n; i++)
{
scanf("%s %c", s.name, &s.sex);
if (s.sex == 'm')
EnQueue(&Qm, s);
else if (s.sex == 'f')
EnQueue(&Qf, s);
j++;
}
if (j != n || QueueEmpty(&Qm) || QueueEmpty(&Qf))
{
printf("error");
return ERROR;
}
while (k--)
{
DeQueue(&Qm, &m);
DeQueue(&Qf, &f);
printf("%s %s\n", m.name, f.name);
EnQueue(&Qm, m);
EnQueue(&Qf, f);
}
DestroyQueue(&Qm);
DestroyQueue(&Qf);
return OK;
}
int main()
{
int n,k;
scanf("%d %d",&n,&k);
dancePartner(n,k);
return 0;
}
标签:return,int,SqQueue,舞伴,rear,front,OK,配对,模拟
From: https://blog.51cto.com/u_16030624/6186228