稳定匹配问题——稳定婚姻算法设计


图片源自:美剧《How I met your mother》

****

本代码带有详细的注释,并在控制台输出时详细地说明了算法的过程,非常有助于新手理解稳定匹配问题和稳定婚姻算法的设计思路。

****

#include <iostream>
using namespace std;
bool finish_or_not(intint *);
bool current_male_is_better(int num, int *male_rank_in_female, int current, int chasing);
int main(){
   int num = 5;
   /*cout << "输入数目n:";
   cin >> num;
   cout << "数目:" << num << endl;

   //男人和女人心目中异性的排行
   int **female_rank_in_male, **male_rank_in_female;
   female_rank_in_male = new int*[num];
   male_rank_in_female = new int*[num];
   for (int i = 0; i < num; i++){
   female_rank_in_male[i] = new int[num];
   male_rank_in_female[i] = new int[num];
   }

   for (int i = 0; i < num; i++){
   for (int j = 0; j < num; j++){
   cout << endl << "请输入男人" << i + 1 << "心目中的第" << j + 1 << "名:";
   cin >> female_rank_in_male[i][j];
   }
   }
   for (int i = 0; i < num; i++){
   for (int j = 0; j < num; j++){
   cout << endl << "请输入女人" << i + 1 << "心目中的第" << j + 1 << "名:";
   cin >> male_rank_in_female[i][j];
   }
   }*/


   int female_rank_in_male[5][5] = { { 21453 }, { 42135 }, { 25341 }, { 14325 }, { 24153 } };
   int male_rank_in_female[5][5] = { { 51243 }, { 32415 }, { 23451 }, { 15432 }, { 42531 } };

   //男人和女人正在约会的对象
   int *date_of_male = new int[num];
   int *date_of_female = new int[num];
   for (int i = 0; i < num; i++){
       date_of_male[i] = 0;
       date_of_female[i] = 0;
   }

   //男人追求过的女人的数量
   int *num_of_chased_female = new int[num];
   for (int i = 0; i < num; i++){
       num_of_chased_female[i] = 0;
   }

   while (finish_or_not(num, date_of_male) == false){//如果有男人没有约会对象
       for (int i = 0; i < num; i++){//按序号遍历所有男人
           cout << "正在查看男人 " << i + 1 << " 有没有约会对象..." ;
           if (date_of_male[i] == 0){//如果某男人没有约会对象
               cout << endl;
               cout << "男人 " << i + 1 << " 没有约会对象!" << endl;
               //该男人准备追的女人(该男人优先表中还没追求过的排名最高的女人)
               int female_to_chase = female_rank_in_male[i][num_of_chased_female[i]];
               //该男人准备追的女人的现任
               int date_of_female_to_chase = date_of_female[female_to_chase - 1];
               cout << "男人 " << i + 1 << " 准备追女人 " << female_to_chase << ",女人现任是 " << date_of_female_to_chase << endl;

               if (date_of_female_to_chase == 0){//如果该男人准备追的女人没有现任
                   date_of_male[i] = female_to_chase;//该男人的约会对象变成准备追的女人
                   date_of_female[female_to_chase - 1] = i + 1;//男人准备追的女人的约会对象变成该男人
                   cout << "男人 " << i + 1 << " 和女人 " << female_to_chase << " 在一起了!" << endl;
               }
               else if (current_male_is_better(num, male_rank_in_female[female_to_chase - 1], date_of_female_to_chase, i + 1)){
                   //如果该男人准备追的女人的现任在女人心目中比该男人更好,则什么也不做
                   cout << "男人 " << i + 1 << " 被女人 " << female_to_chase << " 拒绝了!" << endl;
               }
               else{//如果该男人比该男人准备追的女人的现任在女人心目中更好
                   date_of_male[date_of_female_to_chase - 1] = 0;//该男人准备追的女人的现任回到单身状态
                   date_of_male[i] = female_to_chase;//该男人的约会对象变成准备追的女人
                   date_of_female[female_to_chase - 1] = i + 1;//该男人准备追的女人的约会对象变成该男人
                   cout << "男人 " << i + 1 << " 和女人 " << female_to_chase << " 在一起了!男人 " << date_of_female_to_chase << " 变成单身!" << endl;
               }
               num_of_chased_female[i]++;//该男人追过的女人数量加1
               cout << "男人 " << i + 1 << " 追过的女人数目是 " << num_of_chased_female[i] << endl;
           }
           else{
               cout << "查得已有对象:女人 " << date_of_male[i]  << endl;
           }
       }
   }

   //最后的输出
   cout << endl <<"男人:";
   for (int i = 0; i < num; i++){
       cout << i + 1 << " ";
   }
   cout << endl << "女人:";
   for (int i = 0; i < num; i++){
       cout << date_of_male[i] << " ";
   }
   cout << endl << endl;

   /*
   //删除数组
   for (int i = 0; i < num; i++){
   delete[] female_rank_in_male[i];
   delete[] male_rank_in_female[i];
   }
   delete[] female_rank_in_male;
   delete[] male_rank_in_female;*/

   delete[] date_of_male;
   delete[] date_of_female;
   delete[] num_of_chased_female;

   return 0;
}

bool finish_or_not(int num, int *date_of_male){

   cout << endl << "排序:";
   for (int i = 0; i < num; i++){
       cout << date_of_male[i] << " ";
   }
   cout << endl << endl;

   for (int i = 0; i < num; i++){
       if (date_of_male[i] == 0){
           cout << "还未完全匹配......" << endl << endl;
           return false;
       }
   }
   cout << "已完全匹配!!!" << endl;
   return true;
}

//比较某女人现在的约会对象和追求者哪个在她心目中排行更高
//注意数组参数是一维(一位女人的优先表而不是所有女人的优先表)
bool current_male_is_better(int num, int *male_rank_in_female, int current, int chasing){
   int rank_of_current, rank_of_chasing;
   for (int i = 0; i < num; i++){
       if (male_rank_in_female[i] == current){
           rank_of_current = i;
       }
       if (male_rank_in_female[i] == chasing){
           rank_of_chasing = i;
       }
   }
   cout << "现任排名是 " << rank_of_current << " 追求者排名是 " << rank_of_chasing << endl;
   if (rank_of_current < rank_of_chasing)
       return true;
   else
       return false;
}


更新:新增萌萌哒版本,像写小说一样说出来~

****

#include <iostream>
using namespace std;
bool finish_or_not(intint *);
bool current_male_is_better(int num, int *male_rank_in_female, int current, int chasing);
int main(){
   int num = 5;

   int female_rank_in_male[5][5] = { { 21453 }, { 42135 }, { 25341 }, { 14325 }, { 24153 } };
   int male_rank_in_female[5][5] = { { 51243 }, { 32415 }, { 23451 }, { 15432 }, { 42531 } };

   for (int i = 0; i < num; i++){
       cout << "男生 " << i << " 心目中妹子的排行:";
       for (int j = 0; j < num; j++){
           cout << female_rank_in_male[i][j] << " ";
       }
       cout << endl;
   }
   cout << endl;
   for (int i = 0; i < num; i++){
       cout << "女生 " << i << " 心目中男生的排行:";
       for (int j = 0; j < num; j++){
           cout << male_rank_in_female[i][j] << " ";
       }
       cout << endl;
   }

   //男生和妹子正在约会的对象
   int *date_of_male = new int[num];
   int *date_of_female = new int[num];
   for (int i = 0; i < num; i++){
       date_of_male[i] = 0;
       date_of_female[i] = 0;
   }

   //男生追求过的妹子的数量
   int *num_of_chased_female = new int[num];
   for (int i = 0; i < num; i++){
       num_of_chased_female[i] = 0;
   }

   do{//如果有男生没有对象
       for (int i = 0; i < num; i++){//按序号遍历所有男生
           cout << endl << "正在查看男生 " << i + 1 << " 有没有对象..." << endl;
           if (date_of_male[i] == 0){//如果某男生没有对象
               cout << "男生 " << i + 1 << " 没有对象!" << endl;
               //该男生准备追的妹子(该男生优先表中还没追求过的排名最高的妹子)
               int female_to_chase = female_rank_in_male[i][num_of_chased_female[i]];
               //该男生准备追的妹子的现任
               int date_of_female_to_chase = date_of_female[female_to_chase - 1];
               cout << "男生 " << i + 1 << " 准备追妹子 " << female_to_chase;
               if (date_of_female_to_chase != 0){ 
                   cout << ",妹子现任是 " << date_of_female_to_chase << endl
               }
               else{
                   cout << ",妹子目前是单身的呢~" << endl;
               }

               if (date_of_female_to_chase == 0){//如果该男生准备追的妹子没有现任
                   date_of_male[i] = female_to_chase;//该男生的对象变成准备追的妹子
                   date_of_female[female_to_chase - 1] = i + 1;//男生准备追的妹子的对象变成该男生
                   cout << "这样子的话,男生 " << i + 1 << " 和妹子 " << female_to_chase << " 在一起了!" << endl;
               }
               else if (current_male_is_better(num, male_rank_in_female[female_to_chase - 1], date_of_female_to_chase, i + 1)){
                   //如果该男生准备追的妹子的现任在妹子心目中比该男生更好,则什么也不做
                   cout << "所以!男生 " << i + 1 << " 被妹子 " << female_to_chase << " 拒绝了!" << endl;
               }
               else{//如果该男生比该男生准备追的妹子的现任在妹子心目中更好
                   date_of_male[date_of_female_to_chase - 1] = 0;//该男生准备追的妹子的现任回到单身状态
                   date_of_male[i] = female_to_chase;//该男生的对象变成准备追的妹子
                   date_of_female[female_to_chase - 1] = i + 1;//该男生准备追的妹子的对象变成该男生
                   cout << "所以!男生 " << i + 1 << " 和妹子 " << female_to_chase << " 在一起了!" << endl;
                   cout<< "与此同时,不幸的是,男生 " << date_of_female_to_chase << " 变成单身狗了QAQ" << endl;
               }

               num_of_chased_female[i]++;//该男生追过的妹子数量加1
           }
           else{
               cout << "男生已经跟妹子 " << date_of_male[i] << " 在一起了呢~~下一个吧~~~" << endl;
           }
       }
   } while (finish_or_not(num, date_of_male) == false);

   //最后的输出
   cout << endl << "┌───故事的结局───┐"<<endl;
   cout << "│                      │" << endl;
   for (int i = 0; i < num; i++){
       cout << "│     男生" << i + 1 << " - "<< "女生" << date_of_male[i] <<"    │"<< endl;;
   }

   cout << "│                      │" << endl;
   cout << "└───────────┘" << endl << endl;
   delete[] date_of_male;
   delete[] date_of_female;
   delete[] num_of_chased_female;
   system("pause");
   return 0;
}

bool finish_or_not(int num, int *date_of_male){

   for (int i = 0; i < num; i++){
       if (date_of_male[i] == 0){
           cout << "还有单身狗......再来~" << endl;
           return false;
       }
   }
   cout << endl << "已全部脱离单身狗行列!!!" << endl;
   return true;
}

//比较某妹子现在的对象和追求者哪个在她心目中排行更高
//注意数组参数是一维(一位妹子的优先表而不是所有妹子的优先表)
bool current_male_is_better(int num, int *male_rank_in_female, int current, int chasing){
   int rank_of_current, rank_of_chasing;
   for (int i = 0; i < num; i++){
       if (male_rank_in_female[i] == current){
           rank_of_current = i;
       }
       if (male_rank_in_female[i] == chasing){
           rank_of_chasing = i;
       }
   }
   cout << "在妹子心目中现任排名是 " << rank_of_current << " ,而追求者排名则是 " << rank_of_chasing << endl;
   if (rank_of_current < rank_of_chasing)
       return true;
   else
       return false;
}


喜欢这个「爱情故事」么?


本文作者:CSDN博客作者-theusProme

文章版权归原作者所有,转载仅供学习使用,不用于任何商业用途,如有侵权请留言联系删除,感谢合作。


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/304022.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如果诸葛亮用C#写出师表...

❝看到一篇18年的文章 "C版《出师表》"&#xff0c;站长觉得挺有意思的&#xff0c;就用C# 控制台也实现了一遍&#xff0c;技术上没啥难度&#xff0c;但复制代码费了1、2个小时&#xff0c;纯粹无聊写着玩&#xff0c;看者别在意枚举、类名、变量中文命名&#xff…

这16个数据可视化案例,惊艳了全球数据行业

数据可视化可以帮你更容易的解释趋势和统计数据。数据是非常强大的。当然&#xff0c;如果你能真正理解它想告诉你的内容&#xff0c;那它的强大之处就更能体现出来了。通过观察数字和统计数据的转换以获得清晰的结论并不是一件容易的事。必须用一个合乎逻辑的、易于理解的方式…

asp.net core 自定义 Content-Type

asp.net core 实现支持自定义 Content-TypeIntro我们最近有一个原本是内网的服务要上公网&#xff0c;在公网上有一层 Cloudflare 作为网站的公网流量提供者&#xff0c;CloudFlare 会有一层防火墙拦截掉一些非法的请求&#xff0c;我们有一些 API 会提交一些 html 内容&#x…

如何优雅的移植JavaScript组件到Blazor

Blazor作为一个新兴的交互式 Web UI 的框架&#xff0c;有其自身的优缺点&#xff0c;如果现有的 JavaScript 组件能移植到 Blazor&#xff0c;无疑让 Blazor 如虎添翼&#xff0c;本文就介绍一下自己在开发 BulmaRazor 组件库的时&#xff0c;封装现有的 JavaScript 组件的方法…

把握人工智能命脉的有效方法

最近广州的天气老是变幻无常&#xff0c;往往今天还热得要命第二天就寒风瑟瑟&#xff08;如下图&#xff09;&#xff0c;让小天甚是怀念每天艳阳高照的夏天&#xff0c;虽然热了点但好歹不用担心猝不及防地收到寒风暴雨黄色预警。说到夏天&#xff0c;不得不提一下1956年的那…

微软的焦虑?想多了!从.NET6 Preview2到大厂招聘,起飞

看了篇文章叫《从.NET看微软的焦虑》&#xff0c;这里忍不住先吐槽一下&#xff0c;看完不仅毫无收获&#xff0c;而且有一种先起个夺眼球的标题&#xff0c;然后再东拼西凑找证据。讲真的&#xff0c;微软市值基本上等于“阿里腾讯百度”三者之和&#xff0c;居然还焦虑的无法…

TED演讲:区块链将如何改变世界?看完太震撼了!

区块链是什么&#xff1f;如果你不知道&#xff0c;你应该了解&#xff1b;如果你知道&#xff0c;有可能你仍需要了解一些它工作原理。唐泰普斯科特在此使这改变世界、建立信任的科技变得简明易懂。他表示&#xff0c;这就是第二代互联网&#xff0c;将有可能改变我们的金钱、…

re管理器Java_自定义布局管理器-FormLayout

第二部分&#xff1a;自定义布局管理器在java.awt包与javax.swing包下有许多现成的布局类&#xff0c;比如BorderLayout、FlowLayout&#xff0c;还有较为复杂的、用于精确定位的布局类GridBagLayout、SpringLayout等。起初我刚刚从事gooey时(06年中)&#xff0c;企图依靠JDK自…

如何看待 70% 的程序员,缺乏数据结构和算法知识?

金三银四来了&#xff0c;各大厂动静不小&#xff0c;都在储备人才&#xff0c;绝对是程序员面试的黄金时间了&#xff0c;不少同学也在后台反馈面试中遇到的一些问题&#xff0c;所以今天想跟大家说说算法。说起算法&#xff0c;那大厂面试是绝对必考的&#xff0c;可以说是一…

Sorry,关注这些 IT 技术类公众号,真的可以为所欲为

工作和生活节奏超快的今天&#xff0c;想要不断提升自我&#xff0c;碎片化阅读学习是你最佳的选择&#xff0c;如果你已经有了一颗学习的心&#xff0c;却苦于不知道从哪里学习&#xff0c;那么&#xff0c;这些学习的工具和途径就很重要了。今天为你推荐一些 IT技术领域的微信…

数据告诉你,抖音是如何在半年之内逆袭的

从春节至今&#xff0c;音乐短视频社区“抖音”在苹果应用商店免费排行榜上连续多天霸榜。凭借多元的音乐风格、酷炫的视觉编辑功能、个性化的分发机制以及良好的社区氛围&#xff0c;抖音在上线不久后便受到了年轻用户的追捧。在这一年半的时间里&#xff0c;抖音到底成长到了…

非名校出身的我,是如何拿到Facebook、谷歌、微软、亚马逊和Twitter的Offer的?

非名校出身&#xff0c;也没有知名科技公司的工作经验&#xff0c;他竟同时拿到了美国5家顶尖科技公司的Offer。他究竟是如何做到的&#xff1f;这篇文章是专门为那些即将开始找工作的人写的。很多正在找工作的人可能会担心因为自己不是毕业于常青藤名校而无法在顶尖科技公司找…

GitLab 服务器的迁移以及注意点

Git 已经是代码托管工具中的主流了&#xff0c;如果是自己搭建私有的 Git 服务器我们一般会使用 GitLab &#xff0c;在《在CentOS7中安装GitLab》 一文中有介绍怎样在 CentOS7 中安装 GitLab 。文本主要介绍怎样迁移 GtiLab 。环境CentOS&#xff1a;7.4GitLab&#xff1a;10.…

RHEL5下DNS配置详解3

view 是bind中的另外的一个技巧他在有防火墙的环境中非常有用。View允许你呈现出不同的配置文件给不同的客户&#xff0c;当你的服务器既要给内网的用户又要给外网的用户提供查询服务时使用view将是非常方便的。下其实访问控制列表就是一个有名字的地址匹配列表。它的语法格式为…

百叶窗效果显示图片源码(c#)

2019独角兽企业重金招聘Python工程师标准>>> 显示图片&#xff1a; this.pictureBox.Image Image.FromFile("image.jpg", false); 百叶窗有两种显示效果&#xff0c;一种是垂直百叶窗&#xff0c;另一种是水平百叶窗。 实现百叶窗显示图像有两种方式&…

16个顶级思维模型

思维模型会给你提供一种视角或思维框架&#xff0c;从而决定你观察事物和看待世界的视角。顶级的思维模型能提高你成功的可能性&#xff0c;并帮你避免失败。打造多元思维模型想法来自查理芒格&#xff0c;而查理芒格是沃伦巴菲特的得力助手。Farnam Street曾这样描述思维模型&…

使用BeetleX网关对Web应用进行灰度发布

灰度发布可以更有效地保障服务运作的可靠性&#xff0c;即能让服务得以更新的同时也不影响业务动作。BeetleX网关支持全动态化实时配置&#xff0c;对应用进行灰度发布可以说是非常便利。灰度发布在BeetleX网关中涉及到以下:添加新应用服务&#xff0c;测试路由配置&#xff0c…

17道因为太难而被禁用的Google面试题

即使是最成功的公司&#xff0c;它的招聘过程有时也会很不靠谱&#xff0c;经常会出一些奇怪的看似没有答案的面试问题&#xff0c;但标准答案却让应聘者还没来得及接近「起跑线」就被「退赛」了。Google 曾经就是这样的公司&#xff0c;招聘人员会出一些难为应聘者的高质量问题…

在 .NET Core 中构建 REST API

翻译自 Camilo Reyes 2020年8月26日的文章 《Build a REST API in .NET Core》 [1]REST API 可以使用简单的动词&#xff08;如 POST、PUT、PATCH 等&#xff09;将大型解决方案背后的复杂性隐藏起来。在本文中&#xff0c;Camilo Reyes 解释了如何在 .NET Core 中创建 REST AP…

一个检查SPN的小工具

如果大家配过kerberos的话会发现&#xff0c;AD本身并没有一个可以检查SPN的工具&#xff0c;而SPN一旦配重复的话会出现奇怪的错误&#xff0c;所以我就写了这么一个简单的工具。 截图 使用时候&#xff0c;输入你要查询的AD的名称或者IP&#xff0c;然后输入一个该域的用户信…