如何比较整个2D数组行而不是元素

时间:2019-10-06 06:46:28

标签: c

有关表格的功能。

bool contains_equal_rows(int height, int width, const int ar[height][width])

如何查找是否重复一行?我可以看到如果重复一行,如何将布尔值设置为true,但是如何避免过早返回false

问题描述:

  

编写一个函数,该函数获取给定int尺寸的二维数组。
  如果数组包含具有相同顺序的完全相同值的两行,则返回true,否则返回false。

     
bool contains_equal_rows( int height, int width, const int ar[height][width])
     

示例:

     

输入时

{{1,2,3,4},
{2,3,4,1},
{1,2,3,4}}
     

它返回true。

     

输入时

{{1,2,3,4},
{2,3,4,5},
{3,4,5,6}}
     

它返回false。

     

输入时

{{1,1,1,1},
{2,2,2,2},
{1,1,1,6}}
     

它返回false。

到目前为止我的尝试:

bool contains_equal_rows(int height, int width, const int array[height][width])
{
  int w = width;
  int h = height;
  bool test = false;
  bool matchedRow = false;

  for(int m = 0; m < h; m++)
  {
    for(int n = 0; n < w; n++)
    {
        if( array[m][n] == array[m][n-1] )
        {
            test = true;
        }
        else
        {
            test = false;
        }
    }

    if(test == true)
    {
        matchedRow = true;
    }
  }
  return matchedRow;
}

我的代码的问题在于,我只将一行与之前的一行进行比较,而无法弄清楚如何将一行与全部进行比较。

预期结果如描述所示。

5 个答案:

答案 0 :(得分:2)

您可以添加另一个for循环:

For each row `i`:  
    For every other row `j`:  
        For each column `k` compare `array[i][k]` and `array[j][k]`   

例如这样的东西:

int w = width;
int h = height;
boolean test = false;

for(int i = 0; i < h; i++)
{
    for(int j = i+1; j < h; j++) {
        test = true;
        for(int k = 0; k < w; k++)
        {
            if( array[i][k] != array[j][k] )
            {
                test = false;
            }
        }
        if(test == true)
        {
            return true;
        }
    }
}
return false;

答案 1 :(得分:2)

您应该从1开始外循环。
然后在您的内部循环中比较array[0]array[m]
在进入最内层循环之前,将测试设置为false
一旦测试为真,您就可以退出两个循环并返回true。

答案 2 :(得分:1)

也许最清晰的方法是通过创建一个单独的函数来比较两行来分解任务。然后遍历数组,将每一行与其他所有行进行检查:

bool rows_are_equal(int width, const int row1[], const int row2[])
{
    for (int i = 0; i < width; ++i) if (row1[i] != row2[i]) return false;
    return true;
}

bool contains_equal_rows(int height, int width, const int *array[])
{
    for (int row = 0; row < height; ++row) { // Check each row ...
        for (int test = row + 1; test < height; ++test) { // ... against all the others:
            if (rows_are_equal(width, array[row], array[test])) return true;
        }
    }
    return false;
}

请注意,由于您编写的方法不是标准C语言,因此我已将最后一个参数的格式更改为contains_equal_rows函数。

随时要求进一步的澄清和/或解释。

答案 3 :(得分:0)

尝试一下:

bool contains_equal_rows(int height, int width, const int array[][])
{
int horizontalItr = 0;
int verticalItr = 0;
int verticalItrItrUtility = 0;

bool testIfRowIsRepeated = true;
bool foundAtLeastOneRowIsRepeated = false;
bool finalAnswerRowIsRepeated = false;

for (verticalItr; verticalItr < height - 1; verticalItr++)
{
    for (verticalItrItrUtility = verticalItr; verticalItrItrUtility < height - 1 ; verticalItrItrUtility++)
    {
        testIfRowIsRepeated = true

        for (horizontalItr; horizontalItr < width; horizontalItr++)
        {
            if (array[verticalItrItrUtility][horizontalItr] != array[verticalItrItrUtility + 1][horizontalItr])
            {
                testIfRowIsRepeated = false;
                horizontalItr = 0;
                break;
            }
        }

        if (testIfRowIsRepeated == true)
        {
            foundAtLeastOneRowIsRepeated = true;
            break;
        }
    }

    if (foundAtLeastOneRowIsRepeated)
    {
        finalAnswerRowIsRepeated = true;
        break;
    }
}

return finalAnswerRowIsRepeated;

}

没有测试过,但是对我来说似乎很好, 几件事, 1.我将您的变量名称更改为更清晰的名称。 2.支票应针对下几行,而不是过分的行。 3.概念是我假设每一行都是重复的行,直到循环证明我不是。 请享用! :)

答案 4 :(得分:0)

此代码仅适用于您的测试用例规范,即width = 4。您可以为当前行创建一个外部for循环,以将其与每一行进行比较,请注意,当它与自身进行比较时,标志将等于宽度,因此,如果在任何时候全部使用4,则应避免使用“继续”将其与自身进行比较当前行的元素与任何其他行相同,然后标志变为等于width(即4),并且我们立即返回true,如果我们从具有计数器“ k”的外循环中出来,则两行都不相同,并且我们返回false

bool contains_equal_rows(int height, int width, const int array[][4])
{
int flag = 0;

for (int k = 0;k < height;k++)
    for (int m = 0; m < height; m++)
    {
        if (m == k)
            continue;
        for (int n = 0; n < width; n++)
            if (array[k][n] == array[m][n])
                flag++;
            else
                break;
        if (flag == width)
            return true;
        else
            flag = 0;
    }
return false;
}