循环队列的应用--舞伴配对

在舞会上,男、女各自排成一队。舞会开始时,依次从男队和女队的队头各出一人配成舞伴。如果两队初始人数不等,则较长的那一队中未配对者等待下一轮舞曲。假设初始男、女人数及性别已经固定,舞会的轮数从键盘输入。试模拟解决上述舞伴配对问题。要求:从屏幕输出每一轮舞伴配对名单,如果在该轮有未配对的,能够从屏幕显示下一轮第一个出场的未配对者的姓名。

#include<stdio.h>
#include<stdlib.h>
#define MAX 10
typedef struct{
	char name[20];
	char sex;//f女 m男
}People;

typedef struct{
	 People *base;
	 int front;
	 int rear;
}SqQueue;

void Init_Queue(SqQueue &s,int n){
	s.base=(People *)malloc(MAX*sizeof(People));
	printf("输入名字和性别:\n");
	for(int i=0;i<n;i++){
		scanf("%s",&s.base[i].name);
		getchar();
		scanf("%c",&s.base[i].sex);

	}
	s.front=0;s.rear=n-1;
}

void OutQueue(SqQueue &s1,SqQueue &s2,int n1,int n2){//输出配对人员的姓名
	printf("%s ",s1.base[s1.front].name);
	printf("%c  ",s1.base[s1.front].sex);
	printf("%s ",s2.base[s2.front].name);
	printf("%c",s2.base[s2.front].sex);
	putchar('\n');
	s1.front=(s1.front+1)%n1;
	s2.front=(s2.front+1)%n2;
}


void DancePartner(SqQueue &s1,SqQueue &s2,int t,int n1,int n2){//舞伴配对
	while(t){
		int i=1;
		printf("配对\n");
		while(s1.front!=s1.rear&&s2.front!=s2.rear){
			OutQueue(s1,s2,n1,n2);
		}

		if(s1.front==(s1.rear)){
			OutQueue(s1,s2,n1,n2);
					printf("第%d轮为配对\n",i);
			printf("%s %c\n",s2.base[s2.front].name,s2.base[s2.front].sex);
		}
		else{
			if(s2.front==(s2.rear)){
				OutQueue(s1,s2,n1,n2);
						printf("第%d轮为配对\n",i);
				printf("%s %c\n",s1.base[s1.front].name,s1.base[s1.front].sex);
			}
		}
		printf("===================\n");
		t--;
		i++;
	}
}

int main(){
	SqQueue s1,s2;
	int times,num1,num2;
	scanf("%d%d%d",&num1,&num2,×);
	Init_Queue(s1,num1);
	Init_Queue(s2,num2);
	DancePartner(s1,s2,times,num1,num2);
	return 0;
}
    原文作者:舞伴问题
    原文地址: https://blog.csdn.net/sjlcute/article/details/49869901
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞