跳舞配对问题

问题描述:假定在一舞会上,男士排成一队,女士排成一队。跳舞开始时,依次从男队和女队的队头各出一人配成舞伴。若两队初始人数不相同,则较长的那一队中未配对者等待下一轮舞曲。要求:模拟上述舞伴系统,并能计算对于任何男士A和女士B在哪一轮舞曲中的k次跳舞?

设计思路:

首先,由于当男女排好队后,依次从男队和女队的队头上各出一人配成舞伴,剩下的人继续按顺序配对,具有典型的先进先出特性,因此可以用队列作为算法的数据结构。

在算法中应该先设置两个队列:man (pm),woman(pw)分别存放男士和女士入队者。假设男士和女士的信息存放在一位数组中,作为输入,然后依次扫描该数组各元素,并根据性别来决定是进入男队还是女队。构造好两个队列后,依次将两队队头元素出队来匹配成舞伴,直至某队列变为空,此时若某队仍有待匹配者,输出等待者的名字。

其次,采用二维数组的行表示跳舞的轮数,列表示跳舞的次数。可以实现查询某位男生和某位女生在第几轮的K次跳舞。

代码:

#include <stdio.h>
#include<stdlib.h>
void dancingQueue(int m,int n,int a,int b){
	if(m<=0||n<=0){//人数输入错误,直接返回 
		printf("输入错误\n");
	}
	int* men=(int*)malloc(sizeof(int)*m);//男生队列 
	int* women=(int*)malloc(sizeof(int)*n);//女生队列 
	int i,j;
	//初始化男生和女生队列,编号等同于下标 
	for(i=0;i<m;i++){
		men[i]=i;
	}
	for(i=0;i<n;i++){
		women[i]=i;
	}
	int pm=0,pw=0;//男生出队指针pm,女生出队指针pw 
	int max=m>n?m:n;
	int pmax=max;//男女生人数较大值 
	int pmin=m<n?m:n; //男女生人数较少值 
	int arr[pmax][pmin];//辅助数组,行数代表轮数,列数代表一轮匹配对数
	//初始化辅助空间 
	for(i=0;i<pmax;i++){
		for(j=0;j<pmin;j++){
			if(m>n){
				arr[i][j]=men[pm];
				pm=(pm+1)%m;
			}else{
				arr[i][j]=women[pw];
				pw=(pw+1)%n;
			}
		}
	}
	//输出匹配情况 
	while(max--){//两队列中人数较多的值决定跳舞轮数 
		int min=m<n?m:n;
		printf("第%d轮配对情况:\n",pmax-max);//输出轮数 
		while(min--){//两队列中人数较少的值决定每轮跳舞的次数 
			printf("男生%d号-----女生%d号\n",men[pm],women[pw]);//输出每轮男女生匹配情况 
			pm=(pm+1)%m;//男生队列循环 
			pw=(pw+1)%n;//女生队列循环 
		}
	}
	printf("\n\n");
	//寻找男生a和女生b的配对情况
	if(a>=m||b>=n){
		printf("输入男生女生编号错误"); 
	} else{
		int pa=a,pb=b;
		for(i=0;i<pmax;i++){
			for(j=0;j<pmin;j++){
				if(m<n){
					if((arr[i][j]==pb)&&j==pa){
						printf("第%d轮第%d次,男生%d会和女生%d跳舞\n",i+1,j+1,pa,pb);
					}
				}else{
					if((arr[i][j]==pa)&&j==pb){
						printf("第%d轮第%d次,男生%d会和女生%d跳舞\n",i+1,j+1,pa,pb);
					}
				}
			}
		}
	}
}
int main(){
	int m,n,a,b;
	printf("请输入男生人数和女生人数:");
	scanf("%d%d",&m,&n);//男生人数m,女生人数n 
	printf("请输入男生编号和女生编号:");
	scanf("%d%d",&a,&b);// 要查询的男生编号a,女生编号b 
	dancingQueue(m,n,a,b);
	return 0;
}


  • 2
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
思路: 首先需要一个待配对的队列(男生队列和女生队列),初始时将所有男生与所有女生分别加入待配对的队列中。每支舞曲开始时,从男生队列和女生队列各出一个人组成舞伴,并将舞伴从待配对队列中移除,加入成功匹配的队列中。如果某个性别的待配对队列为空,则该性别的人无法参加此次舞曲。当所有人都已成功匹配或某个性别的待配对队列为空时,结束此次模拟。 步骤: 1. 初始化男生队列和女生队列,加入所有男生和女生; 2. 循环进行舞曲配对,直到所有人都已成功匹配或某个性别的待配对队列为空; a. 如果男生队列和女生队列均不为空,则从中各取一个人组成舞伴,并将舞伴从待配队列中移除,加入成功匹配的队列中; b. 如果男生队列或女生队列为空,则结束此次模拟。 程序实现: ```python def dance_matching(m, n, k): # 初始化男生和女生队列 male_queue = [i+1 for i in range(m)] female_queue = [i+1 for i in range(n)] # 初始化成功匹配队列 matched_queue = [] # 循环进行舞曲配对,直到所有人都已成功匹配或某个性别的待配对队列为空 for i in range(1, k+1): # k次舞曲配对 if not male_queue or not female_queue: break male = male_queue.pop(0) # 取出男生队列的第一个人作为舞伴 female = female_queue.pop(0) # 取出女生队列的第一个人作为舞伴 matched_queue.append((male, female)) # 添加成功匹配队列 print("第{}支舞曲配对成功:男生{}和女生{}".format(i, male, female)) # 输出最终匹配情况 print("舞曲配对结束,共进行了{}支舞曲。".format(min(m, n, k))) print("成功匹配的舞伴有:") for male, female in matched_queue: print("男生{}和女生{}".format(male, female)) ``` 示例调用: ```python dance_matching(5, 4, 5) # 输出第5支舞曲配对情况 ``` 输出: ``` 第1支舞曲配对成功:男生1和女生1 第2支舞曲配对成功:男生2和女生2 第3支舞曲配对成功:男生3和女生3 第4支舞曲配对成功:男生4和女生4 第5支舞曲配对成功:男生5和女生1 舞曲配对结束,共进行了4支舞曲。 成功匹配的舞伴有: 男生1和女生1 男生2和女生2 男生3和女生3 男生4和女生4 ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值