男女完全匹配算法

#include<iostream>
#include<String>
#include"Free_W_M_Stack.cpp"
using namespace std;
int Number1(string elem, string A[], int n){//返回某个人的匹配号
	for (int i = 0; i < n; i++){
		if (elem == A[i])
			return i;
	}
	return -1;
}
int main(){
	int n;//n代表有多少对男女
	cout << "请输出有多少对男女:";
	cin >> n;
	W_M_Stack<int> M_Free(n);//建立一个男人的单身库
	string * M_Name = new string[n], *W_Name = new string[n], temp;
	int **Man = new int*[n], **Woman = new int*[n];//前者代表每个男性的心中女性的排名,后者代表心中的男性的排名
	int *W_IsDating=new int[n];//-1代表还没有约会过,大于-1的值是约会的对象
	int *M_Love = new int[n];//每个男人目前心中预定的表白的人的排名
	cout << "请输出男/女性名字从 0 到 " << n - 1 << " 的各个心目中女/男性编号 0 到 " << n - 1 << " 的排名(空格):" << endl;
	cout << "输出男性的名字 : " << endl;
	for (int i = 0; i < n; i++){
		cin >> M_Name[i];
		M_Free.push(i);
		Man[i] = new int[n];
		cout << M_Name[i] << " 的女性排名是:";
		for (int j = 0; j < n; j++){
			cin >> temp;
			if (i == 0)
				W_Name[j] = temp;
			Man[i][j] = Number1(temp, W_Name, n);
		}
		M_Love[i] = 0;
	}
	cout << endl << endl << "输出女性的名字 : " << endl;
	for (int i = 0; i < n; i++){
		Woman[i] = new int[n];
		cout << W_Name[i] << "  的男性排名是:";
		for (int j = 0; j < n; j++){
			cin >> temp;
			int s=Number1(temp, M_Name, n);
			Woman[i][s] = j;
		}
		W_IsDating[i] = -1;
	}
	while (M_Free.isEmpty()!=-1){//若某个男人还是单身
		int i = M_Free.pop();
		if (W_IsDating[Man[i][M_Love[i]]] == -1){//若男人未表白的女性最赞赏的还未约会
			W_IsDating[Man[i][M_Love[i]]] = i;//女人记录约会的对象
			M_Love[i]++;
		}
		else{
			int k = W_IsDating[Man[i][M_Love[i]]];//如果男人看上的女人已经开始约会了,k代表约会的对象的id
			if (Woman[Man[i][M_Love[i]]][k] <= Woman[Man[i][M_Love[i]]][i]){//如果女人处于约会状态而且目前的对象优于表白的男人
					++M_Love[i];//表白的男人开始找下一个
					M_Free.push(i);
				}
			else{//如果女人处于约会状态而且对表白者的好感优于目前的约会对象
					W_IsDating[Man[i][M_Love[i]]] = i;
					M_Free.push(k);
					++M_Love[i];//表白成功的预定下一个最赞赏的女性
				}
		}
	}
	cout << "最终生成的稳定匹配是:" << endl;
	cout << "男" << "\t" << "女" << "\t" << endl;
	for (int i = 0; i < n; i++){
		cout << M_Name[i] << "\t" << W_Name[Man[i][--M_Love[i]]] << "\t" << endl;
	}
	for (int i = 0; i < n; i++){
		delete[] Man[i];
		delete[]Woman[i];
	}
	delete[] W_Name;
	delete[] M_Name;
	delete[] W_IsDating;
	delete[] M_Love;
}

  

#include<iostream>
using namespace std;
template<class T>class W_M_Stack{//记录男女的单身的情况栈
	int Maxsize;
	int size = -1;
	T* st;
public:
	W_M_Stack(int n){
		Maxsize = n;
	    st = new T[Maxsize];
	}
	int isEmpty(){
		if (size >= Maxsize)
			return 1;
		if (size == -1)
			return -1;
		return 0;
	}
	bool push(T elem){
		if (isEmpty() != 1){
			st[++size] = elem;
			return true;
		}
		return false;
	}
	T pop(){
		if (isEmpty() != -1){
			size--;
			return st[size + 1];
		}
		return -1;
	}
	~W_M_Stack(){
		delete[] st;
	}
};

  

时间: 2024-10-11 23:06:34

男女完全匹配算法的相关文章

G_S男女匹配算法(算法的第一个程序2016.09.19)

1 #include<iostream> 2 using namespace std; 3 int main(){ 4 int Smallest_numberFree = 0;//记录单身的号码最低的男性 5 int i = Smallest_numberFree, n, k = -1;//n代表有多少对男女 6 7 cout << "请输出有多少对男女:"; 8 cin >> n; 9 int **Man = new int*[n], **Woma

朴素和KMP模式匹配算法(Java)

朴素模式匹配算法 public class Test { //朴素模式匹配算法 public int Index(String s,String t,int pos){ int i = pos;//主串中第几个位置开始比较 int j = 0;//模式串中的第一个位置 while(i<s.length()&&j<t.length()){ if(s.charAt(i)==t.charAt(j)){ i++; j++; }else { i = i-j+1;//主串的下一个位置 j

字符串匹配算法总结

转自:http://blog.csdn.net/zdl1016/archive/2009/10/11/4654061.aspx 我想说一句“我日,我讨厌KMP!”.KMP虽然经典,但是理解起来极其复杂,好不容易理解好了,便起码来巨麻烦!老子就是今天图书馆在写了几个小时才勉强写了一个有bug的.效率不高的KMP,特别是计算next数组的部分. 其实,比KMP算法速度快的算法大把大把,而且理解起来更简单,为何非要抓住KMP呢?笔试出现字符串模式匹配时直接上sunday算法,既简单又高效,何乐而不为?

浅谈数据结构之KMP(串中的模式匹配算法)

KMP算法是一种模式匹配算法的改进版,其通过减少匹配的次数以及使主串不回朔来减少字符串匹配的次数,从而较少算法的相应代价,但是,事件万物是普遍归中的,KMP算法的有效性也是有一定的局限的,我将在本文的最后也讨论这个算法的局限性. 一般的匹配算法: KMP基本概念引入: 但是,其实我们会发现,上面的中间两个匹配步骤是没有必要的,因为他们的第一个匹配字母就不相同,完全没有可比性,而当我们在第四次匹配的时候,其实我们从模式串中就可得知,只有当模式串滑到这个地方的时候,它的匹配才是最有价值的,因为从模式

基于灰度的模板匹配算法(三):划分强度一致法(PIU)

简介: 前面几篇文章介绍了一些比较基本的基于灰度的图像配准算法: 基于灰度的模板匹配算法(一):MAD.SAD.SSD.MSD.NCC.SSDA.SATD算法  基于灰度的模板匹配算法(二):局部灰度值编码  基于互信息的图像配准算法:MI.EMI.ECC算法  本文将介绍一种类似的相似度测量算法,叫做划分强度一致法(Partitioned Intensity Uniformity,PIU). PIU算法:         1992年,Woods提出了基于划分强度一致的MR-PET图像配准.在医

[转] 字符串模式匹配算法——BM、Horspool、Sunday、KMP、KR、AC算法一网打尽

字符串模式匹配算法——BM.Horspool.Sunday.KMP.KR.AC算法一网打尽 转载自:http://dsqiu.iteye.com/blog/1700312 本文内容框架: §1 Boyer-Moore算法 §2 Horspool算法 §3 Sunday算法 §4 KMP算算法 §5 KR算法 §6 AC自动机 §7 小结 §1 Boyer-Moore(BM)算法 Boyer-Moore算法原理 Boyer-Moore算法是一种基于后缀匹配的模式串匹配算法,后缀匹配就是模式串从右到

微软面试100题系列:字符串匹配算法,查找包含字符集的子串

觉得这题挺有意思,看了别的博客,找到了一种目前看来还不错的算法,为强化理解,就写了下来. 题目意思: 实现一个挺高级的字符匹配算法: 给一串字符串,要求找到符合要求的字符串,例如对于目的串:123,那么给定字符串中诸如1******3*****2,12******3这些形式的子串都要找出来,即子串中含有目的串的所有字符,输出所有符合条件的字符串,并求出最短子串 .类似于和谐系统. 例如:假如目的串为:"423",输入长字符串为:"4fsdfk2jfl3fd2jfksd3j4d

HiPAC高性能规则匹配算法之查找过程

收到一封邮件,有位朋友觉得我误解了nf-HiPAC,如此的一个高性能算法怎能被什么传统的hash,tree之类的胁迫.是啊,HiPAC是一个很猛的算法,文档也比较少,这就更加增加了其神秘感,但是这决不意味着它是不可理解的,相反,它的思想很简单.       HiPAC算法本质上是一种基于优先级的区间匹配算法,怎么理解呢?我们把匹配域定义成一个连续的区间,那么每一条Rule则定义了该区间的一段子区间,如果多条规则覆盖了相同的子区间,那么就涉及到了优先级的问题,这个在防火墙的访问控制列表中很有用,在

字符串匹配算法

字符串匹配问题的形式定义: 文本(Text)是一个长度为 n 的数组 T[1..n]: 模式(Pattern)是一个长度为 m 且 m≤n 的数组 P[1..m]: T 和 P 中的元素都属于有限的字母表 Σ 表: 如果 0≤s≤n-m,并且 T[s+1..s+m] = P[1..m],即对 1≤j≤m,有 T[s+j] = P[j],则说模式 P 在文本 T 中出现且位移为 s,且称 s 是一个有效位移(Valid Shift). 比如上图中,目标是找出所有在文本 T=abcabaabcaba