属鸡男士的最佳婚配

一月生男:最宜娶马年八月或龙年七月出生的女士。
二月生男:最宜娶鼠年八月或兔年九月出生的女士。
三月生男:最宜娶兔年九月出生的女士。
四月生男:最宜娶蛇年九月出生的女士。
五月生男:最宜娶狗年一月或牛年六月出生的女士。
六月生男:最宜娶牛年八月出生的女士。
七月生男:最宜娶鼠年或马年三月出生的女士。
八月生男:最宜娶猴年八月出生的女士。
九月生男:最宜娶牛年四月或马年十一月出生的女士。
十月生男:最宜娶龙年七月或十一月出生的女士。
十一月生男:最宜娶龙年四月或狗年十月出生的女士。
十二月生男:最宜娶猪年五月或十月出生的女士。
以下是一个简单的C语言程序,用于解决稳定婚配问题: #include <stdio.h> #include <string.h> #define MAX 100 // 存储人员信息的结构体 struct person { char name[MAX]; int rank[MAX]; int partner; int engaged; }; // 判断该人是否在候选名单中 int in_list(int list[], int len, int val) { int i; for (i = 0; i < len; i++) { if (list[i] == val) { return 1; } } return 0; } // 稳定婚配算法 void stable_marriage(struct person men[], struct person women[], int n) { int i, j, k; int num_engaged = 0; int men_list[MAX]; int women_list[MAX]; int free_men[MAX]; int num_free_men = n; memset(men_list, -1, sizeof(men_list)); memset(women_list, -1, sizeof(women_list)); memset(free_men, 0, sizeof(free_men)); // 所有男士都是自由的 for (i = 0; i < n; i++) { free_men[i] = 1; } while (num_engaged < n) { // 随机选择一个自由的男士 for (i = 0; i < n; i++) { if (free_men[i]) { break; } } j = i; // 为该男士选择最喜欢的女士 for (i = 0; i < n && free_men[j]; i++) { k = men[j].rank[i]; if (women[k].partner == -1) { men_list[j] = k; women_list[k] = j; men[j].partner = k; women[k].partner = j; men[j].engaged = 1; free_men[j] = 0; num_engaged++; } else { if (in_list(women[k].rank, n, j)) { // 如果该女士已经有伴侣,但她更喜欢当前男士 int old_partner = women[k].partner; men_list[old_partner] = -1; women_list[k] = j; men[j].partner = k; women[k].partner = j; men[j].engaged = 1; free_men[j] = 0; free_men[old_partner] = 1; } } } } // 输出结果 printf("稳定婚配结果:\n"); for (i = 0; i < n; i++) { printf("%s - %s\n", men[i].name, women[men[i].partner].name); } } int main() { struct person men[MAX]; struct person women[MAX]; int n, i, j; printf("请输入人数:"); scanf("%d", &n); printf("请输入男士姓名和他们对女士的喜好排名(从最喜欢到最不喜欢):\n"); for (i = 0; i < n; i++) { printf("男士%d:", i + 1); scanf("%s", men[i].name); for (j = 0; j < n; j++) { scanf("%d", &men[i].rank[j]); men[i].rank[j]--; // 将喜好排名转换为索引 } men[i].partner = -1; men[i].engaged = 0; } printf("请输入女士姓名和他们对男士的喜好排名(从最喜欢到最不喜欢):\n"); for (i = 0; i < n; i++) { printf("女士%d:", i + 1); scanf("%s", women[i].name); for (j = 0; j < n; j++) { scanf("%d", &women[i].rank[j]); women[i].rank[j]--; // 将喜好排名转换为索引 } women[i].partner = -1; } stable_marriage(men, women, n); return 0; }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值