C中的稳定婚姻算法

时间:2013-10-27 22:45:02

标签: c algorithm

我正在尽力完成此代码。至少在几天的时间里已经超过15个小时,我仍然被卡住了。我用C语言编程,这是我的第一语言,所以我有点像菜鸟我很抱歉。任何形式的帮助都会非常有用。

快速提出第一个问题:

while (manStatus[i] == -1 || womanStatus[i] == -1)

什么是正确的语法或方式来说我想要不断检查我的数组中的元素以查看其中的任何值是否为“-1”(或者实际上,这些数组中的男性和女性是单身,所以继续尝试配对它们。)

我有更多,但是这个让我困扰了好几天。我会继续与其他人挣扎,但如果有人有时间的话,我会喜欢为初学者提供一些帮助。

5 个答案:

答案 0 :(得分:3)

在C中,我们不能简单地期望manStatus[i] == -1检查数组中的所有值,如果匹配true内的任何值,则返回-1

而是你需要编写一个算法,手动对数组中的每个元素进行细致的检查。它实际上非常简单并且使用循环。我在这里实现了它作为一个函数:

bool checkArray(int array[],int arrayLength, int val)
{
    int i;
    for(i = 0; i < arrayLength; i++)
    {
        if(array[i] == val)
            return true;
    }
    return false;
}

现在您可以在声明中调用此函数:

while (checkArray(manStatus, LENGTH_OF_ARRAY, -1) || checkArray(womenStatus, LENGTH_OF_ARRAY, -1))

答案 1 :(得分:0)

嗯,有lsearch可以派上用场,但这是一个非标准的功能。

定义辅助函数以检查值是否在数组中。

int containsInt(int *array, size_t length, int value) {
    size_t i;
    for(i = 0; i < length; i++) {
        if(array[i] == value) {
            return 1;
        }
    }
    return 0;
}

然后你的支票变成,

while(!containsInt(manStatus, numMen, -1) && !containsInt(womanStatus, numWomen, -1))

答案 2 :(得分:0)

如果你想检查manStatus数组中的任何值是否为-1,你可以这样做:

#define NON_WITH_MINUS_ONE 0
#define SOME_WITH_MINUS_ONE 1
int checkMarriage(int *manStatus,int N)
{
  for(i=0;i<N;i++)
    if(manStatus[i]==-1) 
      return SOME_WITH_MINUS_ONE
  return  NON_WITH_MINUS_ONE
}

其中N是数组中元素的数量。然后你可以调用这个函数,例如通过

if(checkMarriage(manStatus, 20)==1) 
{//do something}
else
{ //do something else}

答案 3 :(得分:0)

按照你已经完成的方式,如果你在其他阵列用完之前你的男人或女人都没用,那么你就陷入了无限循环。

一旦没有更多匹配就打破循环的最佳方法是:

while (manStatus[i] == -1` && `womanStatus[i] == -1)

答案 4 :(得分:0)

让我先从数学角度回答。根据我的理解,你有两个有限的集合(幸运的是,地球上人类的数量是有限的......休)。第一个,我将表示 S w 是一组女性(女士们的第一个人!)。第二个是男人的一个: S m

现在,您想要将来自 S w 的女性与来自 S m 的男性配对。每组的基数不保证是相同的。我将表示 i = | S i |,其中i∈{ w,m }。

假设我们有 w&gt; m (嘿嘿嘿),那么你要做的就是选择 m 女性的子集​​ S w,m S w 中的 w (有 w!/((w - m)!。m!)这样的子集)然后在 S m S w,m 之间设置双射。有 m!这样的双射。然后通过将其他女性设置为单一状态来扩展双射(如果我做对了,则为-1。)

从现在开始,您有两种可能性:

  • 生成一个这样的“扩展双射”p 并将男人 i 与女性 p(i)绑定(剩下的可怜的小女人到地位-1)。
  • 您将获得两个部分“配对”的,并且您希望尽可能多地配对剩余的单曲。

在我走得更远之前,你能告诉我哪种方法是你感兴趣的吗?