`
ShadowDai
  • 浏览: 15111 次
  • 性别: Icon_minigender_1
  • 来自: 北京
最近访客 更多访客>>
ss8
社区版块
存档分类
最新评论

C语言实现婚姻匹配问题

阅读更多

最近因为课程需要,看了看婚姻稳定匹配问题,用了两天把代码写完了。

具体问题就不详细写了,这里给出参看的网址。

EOJ上面的问题叙述:http://202.120.106.94/onlinejudge/problemshow.php?pro_id=162

整个思路结合着老师的课件和这篇文章,用C语言完成了整个代码。

 

//
//  main.c
//  MarriageMatch
//
//  Created by shadowdai on 11-11-27.
//  Copyright (c) 2011年 BUPTSSE. All rights reserved.
//

#include <stdio.h>

int main (int argc, const char * argv[])
{
    int manPerference[3][3];//下标表示女士的号码,1-5,储存的值表示对该女士的好感度
    int womanPerference[3];//表示5位女士选择的男士
    int manMostLike[3];//表示男士最喜欢的女士
    int manCurrentMatch[3];//表示当前男士的配对对象
    int womanCurrentMatch[3];//表示当前女士的配对对象
    int womanBool[3];//表示女士的配对状况,0表示未配对,1表示已经配对
    int manBool[3];//表示男士的配对状况
    int MatchNumber = 0;
    int i,j;
    int max,Max;
    
    printf("输入男士的好感度排名:(数字越大表示越喜欢)\n");
    for (i = 0; i < 3; i++) {
        printf("男士%d:\n",i+1);
        for (j = 0; j < 3; j++) {
            scanf("%d", &manPerference[i][j]);
        }
    }
        
    //女士选择男士
    for (i = 0; i < 3; i++) {
        max = 0;
        womanBool[i] = 0;
        manBool[i] = 0;
        Max = manPerference[0][i];
        for ( j = 0; j < 3; j++) {
            if (manPerference[j][i] > Max) {
                max = j;
                Max = manPerference[j][i];
            }
        }
        womanPerference[i] = max;
    }
    
    printf("\n女士的选择:\n");
    for (i = 0; i < 3; i++) {
        printf("女士No.%d选择%d\n",i+1, womanPerference[i]+1);
    }
    
    //选出男士最喜欢的女士
    for ( i = 0; i < 3; i++) {
        for ( j = 0; j < 3; j++) {
            if (manPerference[i][j] == 3) {
                manMostLike[i] = j;
            }
        }
    }
    
    printf("\n男士最喜欢的女士:\n");
    for (i = 0; i < 3; i++) {
        printf("No.%d男士选择了No.%d女士\n",i+1,manMostLike[i]+1);
    }
    printf("\n");
    while (MatchNumber != 3) {
        //根据男士和女士的选择的对象进行匹配
        for (i = 0; i < 3; i++) {
            if (womanBool[manMostLike[i]] == 0 && manBool[i] == 0) {
                //如果该男士选择的女士没有配对,那么将他们配对
                manCurrentMatch[i] = manMostLike[i];
                womanCurrentMatch[manMostLike[i]] = i;
                womanBool[manMostLike[i]] = 1;
                manBool[i] = 1;
                MatchNumber += 1;
                printf("No.%d男士与No.%d女士配对,两位在此之前均没有配对。\n", i+1, manCurrentMatch[i]+1);
            }
            else if(womanBool[manMostLike[i]] == 1 && manBool[i] == 0){
                //如果该女士已经配对,则需要比较该女士更喜欢哪位男士
                if (womanPerference[manMostLike[i]] == i) {
                    //如果该女士选择的是该男士,那么直接进行配对
                    manCurrentMatch[i] = manMostLike[i];
                    womanCurrentMatch[manMostLike[i]] = i;
                    womanBool[manMostLike[i]] = 1;
                    manBool[i] = 1;
                    MatchNumber += 1;
                    printf("No.%d男士与No.%d女士配对,虽然该女士之前有配对对象,但是选择了该男士。\n", i+1, manCurrentMatch[i]+1);
                }
                else if( manPerference[i][manMostLike[i]] > manPerference[womanCurrentMatch[i]][manMostLike[i]]){
                    //如果该女士没有选择该男士,但是该女士现在的配对对象的优先级低于该男士,则将他们配对
                    manBool[womanCurrentMatch[manMostLike[i]]] = 0;
                    manCurrentMatch[i] = manMostLike[i];
                    womanCurrentMatch[manMostLike[i]] = i;
                    womanBool[manMostLike[i]] = 1;
                    manBool[i] = 1; 
                    printf("No.%d男士与No.%d女士配对,虽然该女士之前有配对对象,但是更喜欢该男士。\n", i+1, manCurrentMatch[i]+1);
                }
                else{
                    //如果该女士没有选择该男士,并且该男士的优先级低于该女士,那么该女士拒绝该男士
                    for ( j = 0; j < 3; j++) {
                        //该男士被拒绝之后,只能寻找下一个最喜欢的女士
                        if (manPerference[i][j] == manPerference[i][manMostLike[i]] -1) {
                            manMostLike[i] = j;
                            printf("No.%d男士没有配对成功,所以降低了选择的人士,现在他最喜欢No.%d女士。\n",i+1, j+1);
                            break;
                        }
                    }
                }
            }
            else if(manBool[i] == 1){
                printf("No.%d男士已经配对成功。\n",i+1);
            }
        }
    }
    
    for (i = 0; i < 3; i++) {
        printf("\nNo.%d男士与No.%d女士配对成功!\n", i+1, manCurrentMatch[i]+1);
    }
}
 如果有需要,请标明转载,谢谢!
1
1
分享到:
评论

相关推荐

    算法:C语言实现 第二卷(第5部分) 图算法

    7. 匹配算法:最大匹配、稳定婚姻问题等是图论中的重要概念,图的匹配算法寻找顶点之间的最佳配对。 在C语言中,图算法的实现需要注意数据结构的设计,内存的分配与回收,以及递归和循环等控制流程的优化。C语言为...

    匈牙利算法用C语言描述

    总之,匈牙利算法是一种强大的工具,广泛应用于诸如任务分配、婚姻匹配、网络调度等问题。C语言的实现使得算法可以直接在各种系统中高效运行,为实际应用提供了便利。对于想深入了解图论算法和C语言编程的人来说,...

    2013中兴捧月杯之数字化婚姻配对尝试

    【标题】"2013中兴捧月杯之数字化婚姻配对尝试"涉及的是一个基于C语言编程的项目,旨在利用计算机技术实现婚姻配对的算法。在信息技术日益发达的今天,这样的程序设计能够帮助人们高效地进行匹配分析,减少传统人工...

    C语言算法设计.pdf

    5. **稳定婚姻问题**:找到一个稳定的配对方案。 6. **马步问题**:在一个棋盘上找到马的遍历路径。 **马步问题实例:** - 马步问题可以通过人工演示和编程实现。人工演示包括利用特定技巧(如逆时针均匀转大圈法、...

    20151910042-刘鹏-AG实验08-二部图的最小匹配问题1

    在二部图中寻找最小匹配问题,不仅可以应用于图的理论研究,还可以应用于实际场景,如作业分配、婚姻配对、运输调度等问题。例如,在作业分配问题中,每个学生可以视为一个顶点,每个作业也是一个顶点,匹配边表示...

    匈牙利算法 匈牙利算法(C#版)

    该算法主要用于解决两两配对的问题,例如在任务分配、婚姻匹配或资源分配等场景。在这里,我们将探讨匈牙利算法的基本原理,以及如何使用C#语言实现。 首先,我们需要理解匈牙利算法的核心思想。在一个匹配问题中,...

    匈牙利匹配算法_匈牙利匹配算法_

    在匹配市场中,如婚姻匹配,可以找到使双方满意度最大的配对。 总的来说,匈牙利匹配算法是一个强大的工具,它解决了许多现实世界的问题,并且在不同编程环境中都有实现的可能性。理解其原理并能熟练运用,对于解决...

    稳定婚配问题

    稳定婚配问题是一种经典的算法问题,源于经济学和数学中的匹配理论。它主要研究如何在一组男性和女性之间建立一对一的婚姻...通过C语言实现这一算法,学生不仅能深化对编程的理解,还能进一步掌握匹配理论的核心概念。

    职工信息管理系统(C语言)

    整体来看,这个职工信息管理系统利用C语言的基本结构和函数,实现了一个简单的数据库管理系统,为日常的人力资源管理工作提供了便利。虽然功能相对基础,但对于学习C语言和数据库管理概念的学生来说,这是一个很好的...

    ACM/ICPC算法大全(c语言)

    - 稳定婚姻问题是配对理论中的经典问题,本节介绍了一种O(N^2)的算法解决该问题。 - **拓扑排序** - 拓扑排序是对有向无环图(DAG)进行排序的过程,使得对于图中的每条有向边(u, v),顶点u都出现在顶点v之前。 ...

    算法课 稳定配对

    稳定配对问题是一种经典的算法问题,它在许多领域都有应用,比如婚姻匹配、资源分配等。在这个实验报告中,我们关注的是如何通过编程解决稳定配对问题,具体使用了C语言实现,并给出了MATLAB的核心代码。 稳定配对...

    数模竞赛中的图论问题(大专).ppt.zip

    4. **匹配理论**:包括稳定婚姻问题和匈牙利算法,主要用于资源分配,如工作分配、课程选课系统等,确保分配的稳定性或效率。 5. **图的遍历**:深度优先搜索(DFS)和广度优先搜索(BFS)是图的基本操作,常用于探索图...

    xiongyali.rar_string.h

    在许多实际应用中,如作业分配、婚姻匹配等问题中都能找到它的身影。匈牙利算法,也称为Kuhn-Munkres算法或KM算法,是解决这个问题的有效方法。它通过一系列增广路径的迭代寻找最大匹配,保证了找到的匹配是最大化的...

    【数据结构】男女运动员最佳组合正文终稿.docx

    这个问题可以被视为一个匹配问题,常见于图论中的稳定婚姻问题或者匈牙利算法的应用。 设计要求中,学生需要使用STL(Standard Template Library)的向量数据结构,这是一类动态数组,允许高效地进行元素的插入、...

    合婚程序测试版.rar

    合婚算法在民间文化中通常用于评估两个人的婚姻匹配程度,这种算法可能涉及到生辰八字、星座、血型等多种因素。在程序设计中,合婚算法可能需要用户输入各自的个人信息,然后通过特定的计算规则来评估两人的匹配度,...

    上海交通大学ACM算法模板gai.docx

    - 稳定婚姻匹配:Gale-Shapley算法。 - 后缀数组:处理字符串的有序集合。 - LCA(最近公共祖先):在树上寻找节点的最近公共祖先。 - FFT(快速傅里叶变换):用于快速计算多项式乘法。 以上只是部分关键知识点的...

    最终的职工信息管理系统源代码.docx

    C语言中,可以使用各种排序算法,如冒泡排序、快速排序、归并排序等来实现。 7. **修改(Modify)**: `Modify`函数允许用户更新已存在的员工信息。首先通过`Locate`找到要修改的员工,然后更新对应的字段值。 8....

    合婚程序测试版

    《合婚程序测试版》是一款基于PHP语言编写的软件,主要功能是运用现代流行的爱情匹配算法,为用户提供婚姻相合度的评估。该程序在2008年4月完成开发,具有高度的平台兼容性,能够在任何支持PHP运行的环境上顺利运行...

Global site tag (gtag.js) - Google Analytics