算法分析与设计学习笔记3GS算法实现

代码实现

#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#define MAX 100
typedef struct
{
	int wTotal;
	char wName;
	int WR;
	char *mRank;
	int hus;
	int husInMen;
}*WOMEN,EWOMEN;
typedef struct
{
	int mTotal;
	char mName;
	int MR;
	char *wRank;
	int times;
	int amount;
}*MEN,EMEN;
void Create(WOMEN &W,MEN &M)
{
	printf("请输入女生人数:");
	scanf("%d",&W[0].wTotal);
	printf("请输入男生人数:");
	scanf("%d",&M[0].mTotal);
	for(int i = 1;i<=W[0].wTotal;i++)
	{
		W[i].mRank = (char *)malloc((MAX+1)*sizeof(char));
		W[i].hus = 0;
		W[i].husInMen = 0;
		W[i].WR = 0;
	}
	for (int n = 1; n <= W[0].wTotal; n++)
	{
		printf("请输入%d号女生的名字:",n);
		scanf("\n%c",&W[n].wName);
	}
	for (int j = 1; j <= W[0].wTotal; j++)
	{
		printf("请输入%c对男生的排序:",W[j].wName);
		for(int m = 0;m < M[0].mTotal;m++)
		{
			scanf("\n%c",&W[j].mRank[m]);
		}
	}
	M[0].amount = 0;
	for(j = 1; j <= M[0].mTotal; j++)
	{
		M[j].wRank = (char *)malloc((MAX+1)*sizeof(char));
		M[j].MR = 0;
		M[j].times = 0;
	}
	for(int t = 1; t<=M[0].mTotal;t++)
	{
		printf("请输入%d号男生的名字:",t);
		scanf("\n%c",&M[t].mName);
	}
	for(j = 1; j <= M[0].mTotal; j++)
	{
		printf("请输入%c对女生的排序:",M[j].mName);
		for(int m = 0; m<W[0].wTotal;m++)
		{
			scanf("\n%c",&M[j].wRank[m]);
		}
	}
}
void Proposal(MEN M,WOMEN W)
{
	int i=1;
	int temp,now;
	int wifeLoc;

	while(M[0].amount<M[0].mTotal)
	{
		if(i>M[0].mTotal)
		{
			i = i%M[0].mTotal;
		}
		while(M[i].MR == 0)
		{
			char ch=M[i].mName;
			int location=M[i].times;
			char wifeName=M[i].wRank[location];
			for (int j = 1; j <= W[0].wTotal; j++)
			{
				if (W[j].wName == wifeName)
				{
					wifeLoc=j;
					break;
				}
			}
			for (int t = 0;t<M[0].mTotal;t++)
			{
				if (W[wifeLoc].mRank[t]==ch)
				{
					temp = t;
					break;
				}
			}
			if (W[wifeLoc].WR == 0)
			{
				M[i].MR = 1;
				(M[i].times)++;
				(M[0].amount)++;
				W[wifeLoc].WR = 1;
				W[wifeLoc].husInMen=i;
				W[wifeLoc].hus=temp;
			}
			else
			{
				now=W[wifeLoc].hus;
				if(now<temp)
				{
					(M[i].times)++;
				}
				else
				{
					int nowHus = W[wifeLoc].husInMen;
					M[nowHus].MR = 0;
					(M[i].times)++;
					M[i].MR = 1;
					W[wifeLoc].husInMen=i;
					W[wifeLoc].hus = temp;
				}
			}
		}
		i++;
	}
}
int main()
{
	WOMEN W = (WOMEN)malloc((MAX+1)*sizeof(EWOMEN));
	MEN M = (MEN)malloc((MAX+1)*sizeof(EMEN));
	printf("**************注意:请保持男生与女生的人数相等!!!***********\n");
	Create(W,M);
	Proposal(M,W);
	for (int t = 1;t <= W[0].wTotal;t++)
	{
		int m = W[t].husInMen;
		printf("%c<-->%c\n",W[t].wName,M[m].mName);
	}
	system("pause");
	return 0;
}
例子

在这里插入图片描述

结果

在这里插入图片描述

结果分析

证明结果是稳定的
假设Xavier和Bertha是不稳定的
按照算法逻辑推理,他们之间有两种关系:
一、
Xavier没跟Bertha进行过约会→Xavier喜欢他的女朋友胜过喜欢Bertha→Xavier和Bertha是稳定的
二、
Xavier于Bertha进行过约会:
(1)Xavier与Bertha互相喜欢→Xavier与Bertha是稳定的
(2)Bertha拒绝了Xavier→Bertha喜欢她的男朋友胜过喜欢Xavier→Xavier和Bertha是稳定的
综上所述,假设不成立,所以可证明,结果稳定

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ShadowCui

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值