Проверка, является ли массив диагонально доминирующей матрицей в C - PullRequest
0 голосов
/ 29 мая 2020

У меня проблема с кодированием задачи для моих исследований - алгоритм, который проверяет, является ли 2-мерный массив диагонально-доминирующей матрицей.

Для этого я создал функцию:

      int dd_test(const int *ptr, int width, int height){

      if (width!=height)
        return -1;

      int sum=0;
      int j;

      for (int i=0;i<width;i++){
          for(j=0;j<height;j++){
            if(i!=j){
              if(*((ptr+i*width)+j)!=0)
                sum+=abs(*((ptr+i*width)+j));
              else
                continue;
            }
          }
          if(*((ptr+i*width)+j)<=sum)
            return 0;
          else if (*((ptr+i*width)+j)>sum)
            sum = 0;
      }
      return 1;
    }

Сначала он проверяет, является ли это квадратной матрицей, а затем проверяет, является ли число по диагонали наибольшим в строке. Если это не так, алгоритм возвращает 0; если это так, алгоритм переходит к следующей строке и повторяет это снова. Основная функция выглядит так:

    int main(void) {
  int wid=5, he=5;
  int matrix[5][5]={0};
  int *ma=matrix[0];

  puts("Input a 5x5 matrix: ");
  for(int i=0;i<5;i++){
      if(scanf("%d %d %d %d %d",(ma+i*wid),((ma+i*wid)+1),((ma+i*wid)+2),((ma+i*wid)+3),((ma+i*wid)+4))!=5){
        puts("Incorrect input");
        return 1;
      }
  }

  if(dd_test(ma, wid, he)==1)
    puts("YES");
  else if (dd_test(ma, wid,he)==0)
    puts("NO");

  return 0;
}

Проблема в том, что она всегда возвращает 0. Я не могу найти ошибку, пожалуйста, помогите мне. Я чувствую себя буквально выжженным.

Спасибо.

Ответы [ 2 ]

0 голосов
/ 29 мая 2020

Я немного изменил ваш dd_test. Вы правильно суммировали недиагональные компоненты каждой строки, но в итоге задали неправильное значение для диагонального компонента.

Когда вы спросите *((ptr+i*width)+j), j будет равно высоте. Вместо этого вы должны использовать i, поскольку высота текущей строки также равна положению диагонального компонента строки.

int dd_test(const int* ptr, int width, int height) {
    if (width != height)
        return -1;

    int sum = 0;

    for (int i = 0; i < height; i++) {
        for (int j = 0; j < width; j++) {
            if (i != j) {
                sum += abs(*((ptr + i * width) + j));
            }
        }
        if (*((ptr + i * width) + i) <= sum)
            return 0;
        else if (*((ptr + i * width) + i) > sum)
            sum = 0;
    }
    return 1;
}

Надеюсь, это поможет.

0 голосов
/ 29 мая 2020

Вы должны использовать ptr[i*width+j] вместо *((ptr+i*width)+j), потому что ваш код легче читать.

Ваше условие неточное:

          if(*((ptr+i*width)+j)<=sum)
            return 0;
          else if (*((ptr+i*width)+j)>sum)
            sum = 0;

Оно должно измениться на:

         if(ptr[i*width+i]< sum) // it's similar to if(*((ptr+i*width)+i)< sum)
            return 0;
         else 
            sum = 0;

Вы можете сделать код короче, удалив условие if else в for l oop:

int dd_test(const int *ptr, int width, int height){

    if (width!=height)
        return -1;
    int j, sum = 0;

    for (int i=0;i<width;i++) {
        sum = 0;
        for(j=0;j<height;j++)
            sum += abs(ptr[i*width+j]);
        sum -= abs(ptr[i*width+i]);

        if(ptr[i*width+i] < sum)
            return 0;
    }
     return 1;
}

...