[Delphi] Выбрать элементы матрицы

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by darckmilord, 26 Sep 2010.

  1. darckmilord

    darckmilord Elder - Старейшина

    Joined:
    8 Feb 2007
    Messages:
    50
    Likes Received:
    14
    Reputations:
    0
    Ребят помогите пожалуйста банально сделать правильную выборку.

    1. Имеется матрица m на n элементов ну пусть будет 11 на 8.
    2. Она забита целочисленными от 1 до 5

    Что нужно: указываем на ячейку матрицы, и то число которое в этой ячейке и все числа с которыми оно граничит по столбцу или строке, равные ему, и для всех этих же чисел также граничащих, взять их и все эти ячейки забить нулями.

    Пример:

    [​IMG]

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

    Не могу домыслить как правильно эти ячейки выбрать без быдлокода. За плюсами не заржавею.
     
  2. alexey-m

    alexey-m Elder - Старейшина

    Joined:
    15 Jul 2009
    Messages:
    518
    Likes Received:
    100
    Reputations:
    37
    смотри в сторону рекурсии с обходом четырех граничащих ячеек
     
  3. AGIMgal

    AGIMgal New Member

    Joined:
    9 Jun 2010
    Messages:
    66
    Likes Received:
    0
    Reputations:
    0
    незнаю может нубское предложение но.
    1)читаем содержание соседних ячеек(m+-1,n+-1) присваиваем, если там тоже число нули, и записываете куданить в массив их координаты.

    2) пустить по записанным корам чтение, присвоение и запись как в пункте 1. остановить цикл когда количество записей а масиве координат перестанет увеличиватся.
     
  4. slesh

    slesh Elder - Старейшина

    Joined:
    5 Mar 2007
    Messages:
    2,702
    Likes Received:
    1,224
    Reputations:
    455
    Вообще можно замутить через двойные матрици. вернее сказать через маску, хроняющуюся в другйо мартице. Напряжный но просто в реализации способ.

    Алгоритм будет такой:
    1) есть матрица вторая - она забита нулями.
    2) указав координату, ты запоминаешь что там за цифра, затем во второй матрице ставишь на эту координату 1
    3) обнуляешь счетчик изменения. пробегаешься по первой матрице по всем элементам и сравнимаешься по такому виду: Если число равно нужному числу и в во второй матрице хотябы у одного рядом стоящего элемента есть значение =1. Если да, то во второй матрице ставишь на текущей координате тоже 1. Если поставил 1, то увеличиваешь кол-во сделанных изменений
    4) если было хоть одно изменение(по счетчику глянешь) то выполняешь опять третий пункт
    5) как тока после пробега по матрице изменения больше не будет, то пробегаешься по второй матрице и на тех координатах где стоит 1 надо поставить в первой матрице 0.

    Всё просто и реализуется отсилы строк в 15

    Можно вообще даже без второй матрици делать, достаточно просто первую сразу обнулять
     
  5. slesh

    slesh Elder - Старейшина

    Joined:
    5 Mar 2007
    Messages:
    2,702
    Likes Received:
    1,224
    Reputations:
    455
    Хотя можно замутить и более ускорено и без проверок на граници массива
    1) имеется
    MAS - матрица допустим 8x8
    X, Y - координата числа которое выбрано
    N - кол-во изменений
    2) С - будет равно MAS[X, Y] т.е. запомнили число
    3) MAS[x, y] = 0 - обнулили то место
    4) N = 0;
    5) пробегаемся по массиву по координатам i := 2 to 7 j := 2 to 7
    6) если текущая точка равна нулю, то
    если mas[i , j -1] = C то обнуляем mas[i , j - 1] и N увеличивам
    И так для mas[i , j +1] mas[i - 1, j] и mas[i + 1, j]
    7) если тукущая точка равна C, то проверям
    mas[i , j - 1] mas[i , j +1] mas[i - 1, j] и mas[i + 1, j]
    и если хоть гдето есть ноль, то обнуляем текущую точку. и N увеличивам
    8) если N неравно нулю то переходим к 4 пункту.

    В итоге всё само вычислится буквально за пару итераций
     
    #5 slesh, 27 Sep 2010
    Last edited: 27 Sep 2010
  6. slesh

    slesh Elder - Старейшина

    Joined:
    5 Mar 2007
    Messages:
    2,702
    Likes Received:
    1,224
    Reputations:
    455
    для матрицы 10*10 потребовалось у меня 2-3 итераций

    Код примерно так выглядит
    Code:
      repeat
        n := 0;
        for y := 2 to 9 do
        begin
          for x := 2 to 9 do
          begin
            if mas[x, y] = 0 then
            begin
              if mas[x, y - 1] = c then begin mas[x, y - 1] := 0; inc(n); end;
              if mas[x, y + 1] = c then begin mas[x, y + 1] := 0; inc(n); end;
              if mas[x - 1, y] = c then begin mas[x - 1, y] := 0; inc(n); end;
              if mas[x + 1, y] = c then begin mas[x + 1, y] := 0; inc(n); end;
            end
            else if mas[x, y] = c then
            begin
              if (mas[x - 1, y] = 0) or
                (mas[x + 1, y] = 0) or
                (mas[x, y - 1] = 0) or
                (mas[x, y + 1] = 0) then begin mas[x, y] := 0; inc(n); end;
            end;
          end;
        end;
      until n = 0;
    
     
    1 person likes this.