程序代码:
#include <stdio.h>
#include <stdbool.h>
#define N 3
// 找到 第n位男士当前最中意且未被拒绝过的女士
void findWoman(int sa[N][N], int mostLike[N])
{
for (int i = 0;i < N;i++)
{
int pos = 0, ans = sa[i][0];
for (int j = 0;j < N;j++)
{
if (ans < sa[i][j]) pos = j, ans = sa[i][pos];
}
printf("%2d号男士对%2d号女士求婚\n", i + 1, mostLike[i] = pos + 1);
}
printf("\n");
}
// 获取当前求婚状态
bool getState(int state[N][N+1], int mostLike[N])
{
for (int i = 0;i < N;i++)
{
state[i][0] = 0;
for (int j = 0;j < N;j++)
{
if (mostLike[j] == i + 1) state[i][++state[i][0]] = j + 1;
}
}
return state[0][0] == 1 && state[1][0] == 1 && state[2][0] == 1;
}
// 根据男士的选择,女士将不是最满意的拒绝
void refuseMan(int sa[N][N], int sb[N][N], int state[N][N+1], int n)
{
if (state[n - 1][0] == 0)
{
printf("当前没有男士对第%2d位女士求婚\n", n);
return;
}
// 找到女士的求婚者中最中意的男士
int tm = state[n - 1][1];
int tn = sb[n - 1][tm - 1];
for (int i = state[n - 1][0];i > 1;i--)
{
if (sb[n - 1][state[n - 1][i] - 1] > tn)
{
tm = state[n - 1][i];
tn = sb[n - 1][tm - 1];
}
}
// 将其他男士拒绝
for (int i = state[n - 1][0];i > 0;i--)
{
if (tm != state[n - 1][i])
{
printf("%2d号女士拒绝了%2d号男士\n", n, state[n - 1][i]);
sa[state[n - 1][i] - 1][n - 1] = -1;
}
}
}
// 打印最终结果
void print(int state[N][N+1])
{
for (int i = 0;i < N;i++)
{
printf("%2d号男士选择了%2d号女士\n", state[i][1], i + 1);
}
}
int main()
{
int sa[N][N] = { { 1, 2, 3 }, { 2, 3, 1 }, { 2, 1, 3 } };
int sb[N][N] = { { 3, 2, 1 }, { 2, 3, 1 }, { 2, 3, 1 } };
int mostLike[N] = { 0 }; // a[n]记录当前第n+1位男士最中意的女士
int state[N][N + 1] = { { 0 } }; // state[n]记录当时会对第n位女士求婚的男士,state[n][0]表示人数
while (true)
{
findWoman(sa, mostLike);
if (getState(state, mostLike)) break;
for (int i = 0;i < N;i++)
{
refuseMan(sa, sb, state, i + 1);
}
}
print(state);
return 0;
}
[此贴子已经被作者于2016-3-5 01:43编辑过]