Найти максимум в матрице, заботясь о случае галстука [в C] - PullRequest
0 голосов
/ 09 июня 2018

Я пытаюсь найти максимальное значение в матрице.Я сделал это так в C:

int max = matrix[0][0], max_i = 0, max_j = 0;
for(int i = 0; i < 10; i++) {
    for(int j = 0; j < 10; j++) {
        if(matrix[i][j] > max) {
            max = matrix[i][j];
            max_i = i;
            max_j = j;
        } 
    }
}

Но что, если я хотел бы знать, есть ли связь?В этом случае я бы хотел, чтобы моя функция возвращала -1.Я хотел бы использовать другую переменную для хранения второго по величине значения, но в этом случае мне нужно будет использовать еще две переменные: second_max_i и second_max_j (код запутывается).

Я знаю, как это сделатьс другими двумя циклами (итерация, чтобы найти второе место и сравнить), но есть ли способ сделать это только с двумя циклами (вместо четырех)?

Ответы [ 2 ]

0 голосов
/ 09 июня 2018

Вы можете сделать это, отслеживая, если вы встретите другой элемент с тем же значением, что и ваш текущий макс.Если вы это сделаете, установите флаг «галстук».Всякий раз, когда вы найдете новое максимальное значение, снимите «флажок связи», как показано ниже:

int max = matrix[0][0], max_i = 0, max_j = 0, tie = 0;

for(int i = 0; i < 10; i++) {
    for(int j = 0; j < 10; j++) {
        if(matrix[i][j] == max) {
            tie = 1;
        }
        else if(matrix[i][j] > max) {
            max = matrix[i][j];
            tie = 0;
            max_i = i;
            max_j = j;
        } 
    }
}

Затем вы можете вернуть -1, если tie == 1.

Изменить, чтобы добавить: Обратите внимание, чтос текущим кодом вы инициализируете int max = matrix[0][0], и первый проверяемый элемент также matrix[0][0].Таким образом, если matrix[0][0] ваш максимальный элемент, вы ошибочно обнаружите связь.Чтобы предотвратить это, если вы знаете, что матрица никогда не будет содержать значение ниже некоторого значения, вы можете инициализировать max значением, меньшим этого значения.Например, если вы можете гарантировать, что матрица будет содержать только неотрицательные целые числа, вы можете инициализировать int max = -1.

0 голосов
/ 09 июня 2018

Рассмотрим приведенный ниже фрагмент кода:

int dancers = [[1,2], [3,4]];
int max = -1, max_i = -1, max_j = -1;
for(int i = 0; i < 2; i++) {
    for(int j = 0; j < 2; j++) {
        if(matrix[i][j] > max) {
            max = dancers[i][j];
            max_i = i;
            max_j = j;
        } 
        else if(matrix[i][j] == max){
            max_i = -1;
            max_j = -1;
        }
    }
}

if(max_i == -1 && max_j == -1){
  max = -1;
}

Теперь вы можете проверить max, если есть победитель, если -1, то есть ничья.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...