【问题标题】:Check each column and row for duplicate检查每一列和每一行是否重复
【发布时间】:2018-11-19 22:02:53
【问题描述】:

我必须通过用户输入检查拉丁方是否为真。但我不知道如何做检查部分,它检查每一列和每一行是否有重复的数字。

这是我想出来的,但它似乎不能正常工作:

// arr= input by user in array, and n= array length by user input     
bool latin(int**arr,int n)
    {
      int times=0;
      int s;

        for(int j=0;j<n;j++)
            {
            for(int i=0; i<n;i++){

                if (arr[i][j]==s) times++;

            }
        }

    if (times != 1) return false;
    else return true;
    }

【问题讨论】:

  • 你想出了一个相当随机的代码,所以难怪它不能“正常工作”。我建议你先用笔和纸坐下来,用人类语言自己制定算法——想象你有一个非常听话但相当不老练的仆人,你正在向他们解释任务的顺序,他们必须执行。比尝试将其翻译成编程语言。还有一种有用的技术叫做rubberduckdebugging.com
  • 那么s到底是什么?

标签: c++ arrays multidimensional-array


【解决方案1】:

你可能想要传递一个单维数组:

bool latin(int const * const arr, unsigned int capacity)
{
  int counter = 0;
  int s; // Please initialize this.
  for (int row = 0; row < MAXIMUM_ROWS; ++row)
  {
    for (int column = 0; column < MAXIMUM_COLUMNS; ++column)
    {
       const int value = *(arr + row * MAXIMUM_COLUMNS + column);
       if (value == s) // Remember s is not initialized.
       {
         ++counter;
       }
    }
  }
  return counter == 1;
}

在上面的代码中,数组中的槽是通过公式来访问的:

value = *(arr + row * MAXIMUM_COLUMNS + column);

编译器将生成用于访问二维数组的类似代码,前提是您指定列数,例如(int arr[][MAXIMUM_COLUMNS], int capacity)。因为一个二维数组在内存中被分配为一个大的一维数组。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-07-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-06
    • 1970-01-01
    • 2014-07-28
    • 1970-01-01
    相关资源
    最近更新 更多