舞伴问题

#include<stdio.h>
#include<stdlib.h> 
#include<conio.h>
#define max 100
typedef struct
{
char name[20];
char sex;
}Person;
typedef struct
{
Person date[max];
int first;
int last; 
}sequeue; 
int empty(sequeue *p)           //是否为空 
{
if(p->first==p->last)
{
return 1;
}
return 0;
}


void initqueue(sequeue **p)     //初始化 
{
*p=(sequeue*)malloc(sizeof(sequeue));
if((*p)!=NULL)
{
(*p)->first=-1;
(*p)->last=-1;
}
else
{
printf("memory overflow!\n");
exit (0);

}
}
void freequeue(sequeue **p)
{
if(*p==NULL)
{
printf("memory is freed\n");
    }
else
{ 
free(*p);
    }
}




Person gethead(sequeue *p)     //取队头 
{
Person x;
if(empty(p))
{
printf("queue is free\n");

}
x=p->date[p->first+1];
getch();
return x;
}




void Enqueue(sequeue *p,Person x)//入队 
{
if(p->last==max-1)
{
printf("队列已满\n");
getch();
}
else
{
p->last++;
p->date[p->last]=x;

}
}


Person outqueue(sequeue *p)     //出队 
{
Person x;
if(empty(p))
{
printf("队列为空\n");
}
else
{
p->first++;
x=p->date[p->first];
return x;
}
}


void wuban(Person dancer[],int num)
{
int i;
Person p;
sequeue *man,*women;
initqueue(&man);
initqueue(&women);
for(i=0;i<num;i++)
{
p=dancer[i];
if(p.sex=='F'||p.sex=='f')  Enqueue(women,p);
else                        Enqueue(man,p);
}
printf("----配对结果----\n"); 
while(!empty(man)&&!empty(women))
{
p=outqueue(women);
printf("%s",p.name);
p=outqueue(man);
printf("   =====   %s\n",p.name);
} 
if(!empty(women))
{
p=gethead(women);
printf("可在下一轮获得舞伴的是:");
printf("%s",p.name);
}
else if(!empty(man))
{
p=gethead(man);
printf("可在下一轮获得舞伴的是:");
printf("%s",p.name);
} 
}
void main()
{ 
    int i;
int num;
sequeue *p;
    Person dancer[30];
    printf("请输入跳舞的人数:");
scanf("%d",&num); 
for(i=0;i<num;i++)
{
    printf("请输入舞者的姓名:");
scanf("%s",dancer[i].name);
    printf("请输入舞者的性别:");
scanf("%c%c",&dancer[i].sex,&dancer[i].sex);
}
    wuban(dancer,num);
    freequeue(&p);
}

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
舞伴问题是一个稳定匹配问题,也被称为Gale-Shapley算法。它是一个经典的算法,用于解决两组人之间的配对问题,其中每个人都有自己的偏好列表。算法的目标是找到一个稳定的匹配,即不存在任何一对人,他们更喜欢彼此而不是他们当前的配对。 以下是一个用Python演示舞伴问题的例子: ```python def stable_matching(men, women): # 创建一个字典,用于存储每个人的当前配对 engaged = {} # 创建一个字典,用于存储每个人的偏好列表 preferences = {} # 创建一个队列,用于存储未匹配的男性 free_men = [] # 初始化未匹配的男性队列和偏好列表 for man in men: free_men.append(man) preferences[man] = women[man] # 开始匹配过程 while free_men: man = free_men[0] woman = preferences[man][0] # 如果女性没有配对,直接匹配 if woman not in engaged: engaged[woman] = man free_men.pop(0) else: current_man = engaged[woman] # 如果女性更喜欢当前的配对,继续匹配下一个男性 if preferences[woman].index(man) < preferences[woman].index(current_man): free_men.pop(0) free_men.append(current_man) engaged[woman] = man # 更新男性的偏好列表 preferences[man] = preferences[man][1:] return engaged men = ['Tom', 'John', 'Mike'] women = {'Tom': ['Mary', 'Jane', 'Lisa'], 'John': ['Jane', 'Mary', 'Lisa'], 'Mike': ['Lisa', 'Mary', 'Jane']} result = stable_matching(men, women) print(result) ``` 输出结果为: ``` {'Mary': 'Tom', 'Jane': 'John', 'Lisa': 'Mike'} ``` 这表示Mary与Tom匹配,Jane与John匹配,Lisa与Mike匹配。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值