男女稳定匹配算法 C

男女稳定匹配算法 C

代码

#include<stdio.h>

#include <windows.h>
#define N 5
int Compared(int a, int b, int value);
void chushi();
int * suiji(int min, int max);
void pipei();
//void outher();
struct BOYS
{
    int Blike[10];  //喜欢程度排序,女生的下标
    int free;       //是否已经有配偶,是否是自由的
    int point;      //排序中作为下标,指示男生目前最中意的人
    int soul;       //男生配偶的下标
    /*int fenshu;
    int point2;*/
};

struct GIRLS
{
    int Glike[10];
    int soul;        //女生配偶的下标
    int point;
    int free;
    /*int fenshu;
    int point2;*/
};
struct BOYS boys[N];
struct GIRLS girls[N];

int main()
{

    chushi();
    pipei();
    //outher();
    return 0;
}

void chushi()
{
    //初始化5名男生
    int i, j;
    for (i = 0; i < N; i++)
    {
        int* p = suiji(0, 5);
        printf("请输入第%d男对5名女生好感排序:", i+1);
        for (j = 0; j < N; j++)
        {
            printf("%d ", *p+1);
            boys[i].Blike[j] = *p++;
            //scanf_s("%d", &boys[i].Blike[j]);
        }
        printf("\n");
        boys[i].free = 0;
        boys[i].point = 0;
        boys[i].soul = 0; 
        //boys[i].point2=1;
    }
    //打印初始值
    for (i = 0; i < N; i++)
    {
        printf("男 %d soul %d free %d point %d\t",i+1, boys[i].soul, boys[i].free, boys[i].point);
        printf("blike-->");
        for (j = 0; j < N; j++)
            printf(" %d\t", boys[i].Blike[j]+1);
        printf("\n");
    }


    //初始化5名女生
    for (i = 0; i < N; i++)
    {
        int* p = suiji(0, 5);
        printf("请输入%d女对5名男生好感排序:", i+1 );
        for (j = 0; j < N; j++)
        {
            printf("%d ", *p+1);
            girls[i].Glike[j] = *p++;
        }
            //scanf_s("%d", &girls[i].Glike[j]);
        printf("\n");
        girls[i].free = 0;
        girls[i].point = 0;
        girls[i].soul = 0;    
        //girls[i].point2 = 1;

    }
    //打印初始值
    for (i = 0; i < N; i++)
    {
        printf("女 %d soul %d free %d point %d\t",i+1, girls[i].soul,girls[i].free, girls[i].point);
        printf("glike-->");
        for (j = 0; j < N; j++)
            printf(" %d\t", girls[i].Glike[j]+1);
        printf("\n");
    }
}

int* suiji(int min, int max)
{
    int i, tem, ran;
    static int a[10] = { NULL };
    if (a[1] == NULL)
    {
        int k = 0;
        for (i = 0; i < max; i++)
        {
            a[i] = k++;
        }
    }
    SYSTEMTIME t;
    GetSystemTime(&t);
    srand((unsigned)t.wMilliseconds);
    for (i = 0; i < max; i++)
    {
        ran = rand() % max;
        tem = a[i];
        a[i] = a[ran];
        a[ran] = tem;
    }
    return a;
}

int Compared(int a, int b, int value) //比较男生a和b哪一个在排序中靠前
{
    int i;
    for (i = 0; i < N; i++)
    {
        if (girls[value].Glike[i] == a)
            return 1;
        if (girls[value].Glike[i] == b)
            return 0;
    }
    return -1;
}

void pipei()
{
    int i, j;
    while(1)
    {
        int end = 0;
        for (i = 0; i < N; i++)
        {
            if (boys[i].free != 0) continue;               //判断男生是否单身,free为0单身,不为0非单身
            int value = boys[i].Blike[boys[i].point];   //value 为男生可以选择 中意女生的编号;
            if (girls[value].free == 0)                   //判断中意girl是否单身,if单身,男生和女生配对
            {
                boys[i].soul = value;
                girls[value].soul = i;
                boys[i].free = 1;                         //男生设为非单身
                girls[value].free = 1;
            }
            else
            {
                if (Compared(girls[value].soul, i, value)) //在女生好感排序中,判断前男友和现在男友i比较谁的好感度高,
                {
                    //如果女生对前男友好感度高,则当前男友要选择其他女生,中意指针指向下一个女生
                    boys[i].point++;
                }
                else
                {
                    //前男友设为自由,从排序中删除女生girl;
                    boys[girls[value].soul].free = 0;
                    boys[girls[value].soul].point++;
                    //当前男友与girl配对;
                    boys[i].soul = value;
                    girls[value].soul = i;
                    boys[i].free = 1;
                }
            }
        }
        for (i = 0; i < N; i++)
            if (boys[i].free == 1)
                end++;
        if (end == N)	 break;
    }
    for (i = 0; i < N; i++)
    {
        printf("男 %d -->女 %d\t", i+1, boys[i].soul+1);
        printf("\n");
    }
}

运行结果:

在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值