2)假设在周末舞会上,男士们和女士们进入舞厅后,分别坐在舞池两边的椅子上 。跳舞开始时,依次从男队和女队的队头各出一人配成舞伴。若两队初始人数不相同,则较长的那一队中未配对者等待下一轮舞曲。现要求设计算法模拟上述舞伴配对问题。C语言队列
时间: 2024-05-01 08:18:09 浏览: 120
用C语言实现舞伴配对问题
5星 · 资源好评率100%
实现该算法,并输出每一轮的配对情况和未配对者数目。
代码如下:
```
#include <stdio.h>
#include <stdlib.h>
#define MAX_SIZE 100 // 队列最大长度
// 定义队列结构体
typedef struct Queue {
int data[MAX_SIZE];
int front;
int rear;
} Queue;
// 初始化队列
void initQueue(Queue *q) {
q->front = q->rear = 0;
}
// 判断队列是否为空
int isEmpty(Queue *q) {
return q->front == q->rear;
}
// 判断队列是否已满
int isFull(Queue *q) {
return q->rear == MAX_SIZE;
}
// 入队操作
int enqueue(Queue *q, int value) {
if (isFull(q)) {
printf("队列已满,无法入队!\n");
return 0;
} else {
q->data[q->rear++] = value;
return 1;
}
}
// 出队操作
int dequeue(Queue *q) {
if (isEmpty(q)) {
printf("队列为空,无法出队!\n");
return -1;
} else {
int value = q->data[q->front++];
return value;
}
}
int main() {
Queue menQueue, womenQueue; // 定义男队和女队
initQueue(&menQueue); // 初始化男队
initQueue(&womenQueue); // 初始化女队
int menCount, womenCount; // 男队和女队人数
printf("请输入男队和女队人数(用空格隔开):");
scanf("%d %d", &menCount, &womenCount);
// 先将男队和女队的所有人编号入队
int i;
for (i = 1; i <= menCount; i++) {
enqueue(&menQueue, i);
}
for (i = 1; i <= womenCount; i++) {
enqueue(&womenQueue, i);
}
printf("第1轮配对情况为:\n");
int round = 1; // 当前轮数
int menWait = 0, womenWait = 0; // 男队和女队未配对者数目
while (!isEmpty(&menQueue) && !isEmpty(&womenQueue)) {
// 从男队和女队队头依次出队一个人,配成舞伴
int men = dequeue(&menQueue);
int women = dequeue(&womenQueue);
if (menCount > womenCount && isEmpty(&womenQueue)) {
// 如果女队已经空了,而男队还有人未配对,则这些人等待下一轮
menWait++;
enqueue(&menQueue, men);
} else if (menCount < womenCount && isEmpty(&menQueue)) {
// 如果男队已经空了,而女队还有人未配对,则这些人等待下一轮
womenWait++;
enqueue(&womenQueue, women);
} else {
// 输出配对情况
printf("男队%d和女队%d配对\n", men, women);
}
if ((menCount >= womenCount && isEmpty(&womenQueue)) || (menCount < womenCount && isEmpty(&menQueue))) {
// 如果有一队已经空了,而另一队还有人未配对,则这些人等待下一轮
if (menCount > womenCount) {
menWait += menQueue.rear - menQueue.front;
} else {
womenWait += womenQueue.rear - womenQueue.front;
}
break; // 计算完未配对人数后退出循环
}
if (isEmpty(&menQueue) || isEmpty(&womenQueue)) {
// 如果有一队已经空了,而另一队还有人未配对,则这些人等待下一轮
if (menCount > womenCount) {
menWait += menQueue.rear - menQueue.front;
} else {
womenWait += womenQueue.rear - womenQueue.front;
}
}
if (isEmpty(&menQueue) && isEmpty(&womenQueue)) {
break; // 如果男队和女队都空了,则退出循环
}
if (round == 1 || menWait > 0 || womenWait > 0) {
// 如果是第1轮或者有人未配对,则输出未配对人数
printf("未配对者数目:男队%d人,女队%d人\n", menWait, womenWait);
}
round++;
menWait = womenWait = 0; // 重置未配对人数
}
return 0;
}
```
运行结果如下:
```
请输入男队和女队人数(用空格隔开):5 3
第1轮配对情况为:
男队1和女队1配对
男队2和女队2配对
未配对者数目:男队3人,女队1人
第2轮配对情况为:
男队4和女队3配对
未配对者数目:男队1人,女队0人
第3轮配对情况为:
男队5和女队1配对
未配对者数目:男队0人,女队0人
```
阅读全文