В двумерном массиве найти наибольший элемент тех строк, где все элементы различны - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Дан двумерный массив. Найти наибольший элемент тех строк, в которых все элементы различны. все дело происходит в функции ras (41-80) Все нормально считает, но вот что брать за max??? Если брать просто первый элемент всего массива, то если в первой строке есть повторы, то он все равно останется самым большим элементов, что неверно по условию. Если брать 0 - то если массив будет состоять только из отрицательных элементов, то опять же, 0 будет останется максимальным, если даже его не было в массиве. Как поступить в данном случае???
#include <stdio.h>
#include <conio.h>
 
//int a[10][10];
//int n, m;
 
void vvod(int a[10][10], int *, int *);
int ras(int a[10][10], int *, int *);
void vivod(int);
 
int main(void)
{
    int k, n, m, a[10][10];
    vvod(a, &n, &m);
    k = ras(a, &n, &m);
    vivod(k);
    
    getch();
    return 0;
}
 
void vvod (int a[10][10], int *n, int *m)
{
    int i,j;
    *n = 0;
    *m = 0;
    printf ("Vvedite razmernost massiva (n,m):\n");
        scanf ("%d %d", n, m);
        /*
        pochemy esli vishe postavit & - &n , &m
         to ne budet rabotat????
        */
    printf ("Vvedite elementi massiva:\n");
        for (i=0; i<*n; i++) {
            for (j=0; j<*m; j++) {
                scanf("%d", &a[i][j]);
            }
        }
}
 
int ras(int a[10][10], int *n, int *m)
{
   int i, j, jj, p, max, max_prom, p2;
   max = 0;
   for (i=0; i<*n; i++)
   {
    p = 0; // schetchik povtor. chisel
    p2 = 0; //metka, esli v stoke est povtori
    max_prom = a[i][0];
       for (j=0; j<*m; j++)
       {
        
            for (jj = 0; jj<*m; jj++)
            {
                if (a[i][j] == a[i][jj]) p++;
                if (a[i][j] > max_prom) max_prom = a[i][j];
            }
            
            if (p == 1) //esli vstretilsya tolko etot element napr a[1][1] == a[1][1]
                p = 0;

            if (p > 1)
                {
                    p2 = 1;
                    break;   //esli vstretilos bolshe, napr. : a[1][1] = a[1][3]
                }
       }
 
      if (p2 != 1)
       {
        if (max_prom > max) 
            max = max_prom;
       }

   }
 
   return max;
}
 
void vivod (int a)
{
    printf("Max = %d", a);
}
пока решил данную проблему тем, что за переменной max (44 строка) присвоил самое маленькое значение для int = -2147483648 тогда все работает верно. Но как обойтись без этого?

Решение задачи: «В двумерном массиве найти наибольший элемент тех строк, где все элементы различны»

textual
Листинг программы
    int max_line, max_total, flagFirstLine = 0, flag = 0;
    for(i = 0; i < N; i++){
        for(j = 0; j < M; j++){
            if(not_repeat(A[i])){//not_repeat-функция возвращающая 1 если нет повторов в строке
                flag = 1;
                if(!j)
                    max_line = A[i][j];
                if(A[i][j] > max_line)
                    max_line = A[i][j];
            }
        }
        if(!flagFirstLine && flag){
            max_total = max_line;
            flagFirstLine = 1;
        }
        if(max_line > max_total)
            max_total = max_line;
    }

Объяснение кода листинга программы

  1. В коде используется два вложенных цикла for для перебора всех элементов двумерного массива A.
  2. Переменная flag инициализируется как 0. Она будет использоваться для отслеживания первой строки, в которой все элементы различны.
  3. Переменная flagFirstLine инициализируется как 0. Она будет использоваться для отслеживания первой строки, в которой все элементы различны.
  4. Переменная max_line инициализируется как 0. Она будет использоваться для отслеживания максимального элемента в текущей строке.
  5. Переменная max_total инициализируется как 0. Она будет использоваться для отслеживания наибольшего элемента во всем массиве.
  6. Если функция not_repeat возвращает 1, это означает, что текущий элемент не повторяется в строке.
  7. Если текущий элемент больше max_line, то он становится новым max_line.
  8. Если flag равно 1 и это первая итерация (т.е. flagFirstLine равно 0), то max_total присваивается значение max_line.
  9. Если max_line больше max_total, то max_total присваивается значение max_line.
  10. По завершении циклов, max_total будет содержать наибольшее значение во всем массиве.

Оцени полезность:

10   голосов , оценка 4.2 из 5
Похожие ответы