Начать поиск в массиве с КОНЕЦ (2D) массива

Я хочу начать поиск int в моем массиве с конца массива, а не в начале. Как мне это сделать?

Имейте в виду, что это 2D-массив.

редактировать кто-то спрашивал, как я ищу с самого начала:

В моем файле кода я печатаю матрицу размером 8x8, отображающую случайные числа (1-10). Пользователь дает число для поиска в матрице, а код возвращает позицию, в которой число найдено ПЕРВЫМ:

Position position = new Position();

    Position LookForNumber(int[,] matrix, int findNumber)
    {
        for (int r = 0; r < matrix.GetLength(0); r++)
        {
            for (int c = 0; c < matrix.GetLength(1); c++)
            {
                if (matrix[r, c] == findNumber)
                {
                    Console.WriteLine("Your number {0} first appears on position {1},{2}", findNumber, r, c);
                    position.row = r;
                    position.column = c;
                    return position;
                }
            }
        }
        return position;
    }

Теперь я хочу найти последнюю позицию номера, от которого отказался пользователь.

Приведите пример того, как вы выполняете поиск с начала, и мы исправим это для поиска с конца. Мы это даже объясняем.

eocron 29.11.2018 11:14
for(int i = array.length; i>0; i--) - это то, что вы ищете?
Renatas M. 29.11.2018 11:15

@eocron Я отредактировал свой пост.

Stef 29.11.2018 11:21

Я отредактировал свой ответ на основе вашего редактирования вопроса

Ashkan Mobayen Khiabani 29.11.2018 11:26
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
4
66
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Для поиска в 2D-массиве вам понадобятся 2 цикла, однако вы можете выполнять циклы в обратном порядке:

    Position LookForNumber(int[,] matrix, int findNumber)
    {
        Position position = new Position();
        for (int r = matrix.GetLength(0) - 1; r >= 0 ; r--)
        {
            for (int c = matrix.GetLength(1) - 1; c >= 0 ; c--)
            {
                if (matrix[r, c] == findNumber)
                {
                    Console.WriteLine("Your number {0} first appears on position 
              {1},{2}", findNumber, r, c);
                    position.row = r;
                    position.column = c;
                    return position;
                }
            }
        }
        return null;
    }

Ненавижу, когда побеждает ответ на копипаст :(

Gil Sand 29.11.2018 11:53

@GilSand Я на самом деле написал совершенно другой ответ, отредактировал и использовал код OP после того, как он отредактировал свой вопрос, чтобы наилучшим образом соответствовать его вопросу, вы можете проверить правки, чтобы ответить;)

Ashkan Mobayen Khiabani 29.11.2018 11:58

Тот факт, что массив является 2D, не имеет отношения к вашей проблеме.

Посмотрите, как работают самые обычные базовые петли?

for (int i = 0; i < array.length ; i++)
{
...
}

По сути, вы делаете это, если вам нужно было перевести код на английский

Для всех элементов, начиная с0что мы назначаемi, останавливаясь, не доезжая доarray.length, иadding 1 to i between each iteration, сделайте следующее(...)

Так что все, что вам действительно нужно сделать, это изменить параметры цикла.

Например, вы могли бы сказать, что вашей начальной точкой (то есть i) может быть что-то другое, кроме 0. Что бы вы использовали вместо нуля, если хотите начать с конца вашего массива?

Затем, если вы начинаете с конца, можете ли вы действительно ДОБАВИТЬ значения в i между каждой итерацией? Не совсем, вы бы вышли за пределы, так что же вам делать вместо i++?

В этот момент вам понадобится точка остановки, если вы выполняете итерацию от начала до конца. И ответ заключается в следующем: моя точка остановки - начало массива. Таким образом, средний параметр вашего цикла (который является точкой остановки) должен быть чем-то, что представляет начало вашего массива. Как бы вы это записали?

Обратите внимание, что вы также можете перебирать каждый второй элемент, например, теперь, когда вы понимаете логику.

И тот факт, что вы находитесь в 2D-цикле, означает, что вам нужен один внутренний цикл внутри вашего основного цикла, который будет работать так же, как и внешний цикл. Представьте себе индексы как холст с координатами, а не просто линию с точками.

Если вы не поняли всего, что я имел в виду, я просто запишу ответ, но я думаю, что объяснение достаточно ясное, чтобы вы поняли :)

Спасибо за объяснение, действительно полезное.

Stef 29.11.2018 11:40

Другие вопросы по теме