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

****

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

****

#include <iostream>using namespace std;bool finish_or_not(int, int *);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] = { { 2, 1, 4, 5, 3 }, { 4, 2, 1, 3, 5 }, { 2, 5, 3, 4, 1 }, { 1, 4, 3, 2, 5 }, { 2, 4, 1, 5, 3 } };   int male_rank_in_female[5][5] = { { 5, 1, 2, 4, 3 }, { 3, 2, 4, 1, 5 }, { 2, 3, 4, 5, 1 }, { 1, 5, 4, 3, 2 }, { 4, 2, 5, 3, 1 } };

   //男人和女人正在约会的对象   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(int, int *);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] = { { 2, 1, 4, 5, 3 }, { 4, 2, 1, 3, 5 }, { 2, 5, 3, 4, 1 }, { 1, 4, 3, 2, 5 }, { 2, 4, 1, 5, 3 } };   int male_rank_in_female[5][5] = { { 5, 1, 2, 4, 3 }, { 3, 2, 4, 1, 5 }, { 2, 3, 4, 5, 1 }, { 1, 5, 4, 3, 2 }, { 4, 2, 5, 3, 1 } };

   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

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

稳定匹配问题——稳定婚姻算法设计相关推荐

  1. 稳定匹配(解决婚姻问题)

    婚姻问题 现在有N位男生和N位女生,每个男生都对N个女生的喜欢程度做了排序,每个女生都对N个男生的喜欢程度做了排序,现在需要确定一个稳定的约会状态. 稳定的定义:如果男生i和女生a牵手,但男生i对女生 ...

  2. 稳定匹配 5分钟看懂GS算法 附有常考常见例题及解析

    文章目录 Stable Match 稳定匹配(GS算法) 1. 什么是稳定匹配 2. 为什么叫做稳定匹配 3. 稳定匹配的基本思想 4. 算法的伪代码 5. 为什么这个算法可以产生一个稳定的匹配? 1 ...

  3. “稳定婚姻算法”雨夜谈-M/N资源匹配问题

    连续数月的阴雨绵绵,江南烟雨似乎没有停止的迹象,近日又迎来了下半年目前为止最猛烈的寒潮,无论哪一个都是我超级期待和喜欢的,这样的天气,不适合睡觉. 一个很不错的算法,稳定婚姻算法. 先给出一个概念,来 ...

  4. 稳定匹配婚姻 c++版GS算法

    问题描述 给出一个 n 个男性的集合 M和 n 个女性的集合 W,找到一个"稳定"匹配. 每位男性根据对女性的心仪程度从高至低进行排名: 每位女性根据对男性的心仪程度从高至低进行排 ...

  5. 大名鼎鼎的稳定婚姻算法

    这个问题是我学到的比较有趣的算法问题前几名了,也是当年我们ACM校队面向新生宣讲的时候选择的例题.我们觉得用找对象这种新生会比较感兴趣的问题来忽悠他们,他们上钩的可能性比较大XD. 问题描述 婚姻匹配 ...

  6. 【数学与算法】二部图、匈牙利匹配、稳定婚配

    二部图系列视频 关于匈牙利匹配可以联系下面两篇博客更容易理解和补盲: 带你入门多目标跟踪(三)匈牙利算法&KM算法 趣写算法系列之–匈牙利算法 14.1 二部图 广度优先搜索 广度优先,可以使 ...

  7. 稳定伴侣问题c语言步骤,稳定匹配问题

    这是 Algorithm Design 一书开篇介绍的一个很有意思的问题 问题描述 有n个男人和n个女人(n>=2),每个男人对所有女人有一个好感度排名,每个女人对所有男人也有一个好感度排名.将 ...

  8. 稳定匹配问题(脱单就靠这波了)

    稳定匹配问题之三国 首先,我们先看看问题: 有n个男人和n个女人(n>=2),每个男人对所有女人有一个好感度排名,每个女人对所有男人也有一个好感度排名.将男女两两配对,得到n对男女,称之为一个完 ...

  9. 男女稳定匹配问题——贪心

    今天上课研究生学长讲了一个问题,男女稳定匹配问题,作为一只单身狗觉得这个问题很有意思,下课就试着自己写了下代码. 现有n个男生与n个女生,一男一女配对,要求:       配对的男生与女生互相都是称心 ...

最新文章

  1. 组合计数 ---- Codeforces Round #370 (Div. 2)D. Memory and Scores[dp]
  2. 数据库锁机制为什么很重要?
  3. Win7碎片整理在哪?
  4. SQL Server安全(11/11):审核(Auditing)
  5. 全景图解高铁数据,谁是最有潜力的高铁城市?
  6. 学成在线--16.添加课程计划
  7. mybatis根据表逆向自动化生成代码(自动生成实体类、mapper文件、mapper.xml文件)
  8. [高光谱] (6w字巨详细) GitHub开源项目Hyperspectral-Classification的解析
  9. from scipy import special, optimize, from ._nnls import nnls ImportError: DLL load failed: 找不到指定的模块。
  10. 内容分发网络(CDN)关键技术、架构与应用(一)
  11. c语言回调函数_为什么计算机专业必学C语言?既然是基础,那为何很多人学不懂?...
  12. 【优化预测】基于matlab粒子群算法优化BP神经网络(多输入多输出)【含Matlab源码 1418期】
  13. Python安装graphics库
  14. mysql提权马免杀_webshell/牛逼免杀提权隐藏大马 (1).asp at master · tennc/webshell · GitHub...
  15. win10无法打开超链接,组织策略阻止
  16. win远程桌面连接服务器,远程桌面连接windows服务器
  17. Rax初学者使用心得
  18. 极客战记计算机科学2村庄守卫,「网易官方」极客战记(codecombat)攻略-森林-村庄守护神-village-champion...
  19. 什么是铠装光纤跳线及它的特点?
  20. Shiro的安装和基本使用

热门文章

  1. 【原创】StackOverflow 20万关注的问题:如何实现异步Task超时的处理?
  2. 如何让 Azure AD 里的应用只允许特定用户登录
  3. 边缘计算与云计算的不同,这篇说明白了!
  4. ASP.NET Core gRPC 使用 Consul 服务注册发现
  5. 拿 C# 搞函数式编程
  6. 微软发布 VS Code Java 安装程序,一键安装所有 Java 开发环境
  7. ASP.NET Core中Ocelot的使用:基于服务发现的负载均衡
  8. 在.NET Core微服务中使用HostBuilder和Generic Host
  9. 使用Angular 4、Bootstrap 4、TypeScript和ASP.NET Core开发的Apworks框架案例应用
  10. MySQL在EF Core下的Scaffolding操作