【问题描述】周末舞会上,男生和女生们分别进入舞厅,各自排成一队。假设每首舞曲只能有一名男生一名女生跳舞,跳舞开始,依次从男队和女队队头各取一人配成舞伴,若两队初始人数不同,则较长那一队未配对者等待下一轮舞曲。配对成功的舞伴跳完舞排回各自队伍的最后。现要求写一算法模拟上述舞伴配对问题。

【输入形式】第一行输入两个整数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;
}