问题 J: 舞伴问题

题目描述

一班有 n个学生,有女生 ,也有 男生,现要开一个舞会 。 男女生分别编号坐在舞池的两边的椅子上 。每曲开始时 ,依次从男生和女中各出一人配对跳舞。

舞会开始前,男生和女生会分别按顺序排成2个队列,跳舞时,会不断从男队和女队选择队首队员配成舞伴,直到某队队员全部配完。依次输出各对舞伴的名字。若某队还有剩余队员未配对,则输出剩余队员的队首队员姓名。

输入

首先输入一个n,表示学生总数。1<=n<=100.
然后有n行,每行输入一个学生的姓名和性别。姓名是长度小于20的字符串,性别用字符‘F'和'M'表示,其中'F'表示女生,'M'表示男生。

输出

输出配对的舞伴双方姓名及未配对的首位学生姓名。格式见样例。

样例输入 Copy

8
nameA F
nameB M
nameC M
nameD F
nameE F
nameF M
nameG M
nameH M

样例输出 Copy

nameA & nameB
nameD & nameC
nameE & nameF
nameG
#include <cstdio>
#include <string>
#include <queue>

using namespace std;

int main()
{
	int i, n;
	scanf("%d", &n);
	char name[100], sex[100];
	queue <string> male, female;
	for (i = 0; i < n; i++)
	{
		scanf("%s%s", name, sex);
		if (sex[0] == 'M')
		{
			male.push(name);
		}
		else
		{
			female.push(name);
		}
	}
	for (i = 0; i < n; i++)
	{
		if (female.empty() && male.empty())
		{
			break;
		}
		if (female.empty())
		{
			printf("%s\n", male.front().c_str());
			break;
		}
		if (male.empty())
		{
			printf("%s\n", female.front().c_str());
			break;
		}


		printf("%s & %s\n", female.front().c_str(), male.front().c_str());
		female.pop();
		male.pop();
	}
	return 0;
}

c(配合c++)

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define OK 0
#define ERROR -1

typedef int Status;
typedef char *QElemType;

typedef struct QNode
{
	QElemType data;
	struct QNode *next;
} QNode, *QueuePtr;

typedef struct
{
	QueuePtr front;
	QueuePtr rear;
} LinkQueue;

Status InitQueue(LinkQueue *q)
{
	QueuePtr p = (QueuePtr)malloc(sizeof(QNode));
	if (p == NULL)
	{
		return ERROR;
	}
	q->front = q->rear = p;
	q->front->next = NULL;
	return OK;
}

Status QueueEmpty(LinkQueue q)
{
	if (q.front == q.rear)
		return OK;
	else
		return ERROR;
}

int QueueLength(LinkQueue q)
{
	QueuePtr p, k;
	p = k = (QueuePtr)malloc(sizeof(QNode));
	if (p == NULL)
	{
		return ERROR;
	}

	p = q.front->next;
	k = q.rear;
	int length = 0;
	if (k == NULL)
		return ERROR;
	else
	{
		while(p!=NULL)
		{
			length++;
			p=p->next;
		}
	}
	return length;
}

Status EnQueue(LinkQueue *q, QElemType e)
{
	QueuePtr p = (QueuePtr)malloc(sizeof(QNode));
	if (p == NULL)
	{
		return ERROR;
	}
	p->data = e;
	p->next = NULL;
	q->rear->next = p;
	q->rear = p;
	return OK;

}

Status DeQueue(LinkQueue *q, QElemType *e)
{
	QueuePtr p = NULL; 
	if (q->front == q->rear)
		return ERROR;
	p = q->front->next;
	*e = p->data;
	q->front->next = p->next;
	if (q->front->next == NULL)
	{
		q->rear = q->front;
	}
	free(p);
	return OK;
}

int main(void)
{
	int i, n;
	char name[100], sex[100];
	char *pname = NULL;
	char *pname2 = NULL;
	LinkQueue male, female;
	Status status, status2;
	status = InitQueue(&male);
	if (status == ERROR)
	{
		return EXIT_FAILURE;
	}
	status = InitQueue(&female);
	if (status == ERROR)
	{
		return EXIT_FAILURE;
	}

	scanf("%d", &n);
	for (i = 0; i < n; i++)
	{
		scanf("%s%s", name, sex);
		pname = (char *)malloc(strlen(name) +  1);
		if (pname == NULL)
		{
			return EXIT_FAILURE;
		}
		strcpy(pname, name);
		if (sex[0] == 'M')
		{
			status = EnQueue(&male, pname);
			if (status == ERROR)
			{
				return EXIT_FAILURE;
			}
		}
		else
		{
			status = EnQueue(&female, pname);
			if (status == ERROR)
			{
				return EXIT_FAILURE;
			}
		}
	}
	for (i = 0; i < n; i++)
	{
		status = QueueEmpty(female);
		status2 = QueueEmpty(male);
		if (status == OK && status2 == OK)
		{
			break;
		}
		if (status == OK)
		{
			DeQueue(&male, &pname);
			printf("%s\n", pname);
			free(pname);
			break;
		}
		if (status2 == OK)
		{
			DeQueue(&female, &pname);
			printf("%s\n", pname);
			free(pname);
			break;
		}


		DeQueue(&female, &pname);
		DeQueue(&male, &pname2);
		printf("%s & %s\n", pname, pname2);
		free(pname);
		free(pname2);
	}
	return 0;
}

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值