男女稳定匹配算法 C

男女稳定匹配算法 C

  • 代码
  • 运行结果:

代码

#include#include 
#define N 5
int Compared(int a, int b, int value);
void chushi();
int * suiji(int min, int max);
void pipei();
//void outher();
struct BOYS
{int Blike[10];  //喜欢程度排序,女生的下标int free;       //是否已经有配偶,是否是自由的int point;      //排序中作为下标,指示男生目前最中意的人int soul;       //男生配偶的下标/*int fenshu;int point2;*/
};struct GIRLS
{int Glike[10];int soul;        //女生配偶的下标int point;int free;/*int fenshu;int point2;*/
};
struct BOYS boys[N];
struct GIRLS girls[N];int main()
{chushi();pipei();//outher();return 0;
}void chushi()
{//初始化5名男生int i, j;for (i = 0; i < N; i++){int* p = suiji(0, 5);printf("请输入第%d男对5名女生好感排序:", i+1);for (j = 0; j < N; j++){printf("%d ", *p+1);boys[i].Blike[j] = *p++;//scanf_s("%d", &boys[i].Blike[j]);}printf("\n");boys[i].free = 0;boys[i].point = 0;boys[i].soul = 0; //boys[i].point2=1;}//打印初始值for (i = 0; i < N; i++){printf("男 %d soul %d free %d point %d\t",i+1, boys[i].soul, boys[i].free, boys[i].point);printf("blike-->");for (j = 0; j < N; j++)printf(" %d\t", boys[i].Blike[j]+1);printf("\n");}//初始化5名女生for (i = 0; i < N; i++){int* p = suiji(0, 5);printf("请输入%d女对5名男生好感排序:", i+1 );for (j = 0; j < N; j++){printf("%d ", *p+1);girls[i].Glike[j] = *p++;}//scanf_s("%d", &girls[i].Glike[j]);printf("\n");girls[i].free = 0;girls[i].point = 0;girls[i].soul = 0;    //girls[i].point2 = 1;}//打印初始值for (i = 0; i < N; i++){printf("女 %d soul %d free %d point %d\t",i+1, girls[i].soul,girls[i].free, girls[i].point);printf("glike-->");for (j = 0; j < N; j++)printf(" %d\t", girls[i].Glike[j]+1);printf("\n");}
}int* suiji(int min, int max)
{int i, tem, ran;static int a[10] = { NULL };if (a[1] == NULL){int k = 0;for (i = 0; i < max; i++){a[i] = k++;}}SYSTEMTIME t;GetSystemTime(&t);srand((unsigned)t.wMilliseconds);for (i = 0; i < max; i++){ran = rand() % max;tem = a[i];a[i] = a[ran];a[ran] = tem;}return a;
}int Compared(int a, int b, int value) //比较男生a和b哪一个在排序中靠前
{int i;for (i = 0; i < N; i++){if (girls[value].Glike[i] == a)return 1;if (girls[value].Glike[i] == b)return 0;}return -1;
}void pipei()
{int i, j;while(1){int end = 0;for (i = 0; i < N; i++){if (boys[i].free != 0) continue;               //判断男生是否单身,free为0单身,不为0非单身int value = boys[i].Blike[boys[i].point];   //value 为男生可以选择 中意女生的编号;if (girls[value].free == 0)                   //判断中意girl是否单身,if单身,男生和女生配对{boys[i].soul = value;girls[value].soul = i;boys[i].free = 1;                         //男生设为非单身girls[value].free = 1;}else{if (Compared(girls[value].soul, i, value)) //在女生好感排序中,判断前男友和现在男友i比较谁的好感度高,{//如果女生对前男友好感度高,则当前男友要选择其他女生,中意指针指向下一个女生boys[i].point++;}else{//前男友设为自由,从排序中删除女生girl;boys[girls[value].soul].free = 0;boys[girls[value].soul].point++;//当前男友与girl配对;boys[i].soul = value;girls[value].soul = i;boys[i].free = 1;}}}for (i = 0; i < N; i++)if (boys[i].free == 1)end++;if (end == N)	 break;}for (i = 0; i < N; i++){printf("男 %d -->女 %d\t", i+1, boys[i].soul+1);printf("\n");}
}

运行结果:

在这里插入图片描述


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部