Поиск верхнего левого элемента
От: Аноним  
Дата: 25.05.10 09:18
Оценка:
Здравствуйте!

Есть 2-х мерный массив заполненный 1 и 0. Как найти крайний левый верхний элемент, котороый равен 0?
Re: Поиск верхнего левого элемента
От: batu Украина  
Дата: 25.05.10 09:33
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте!


А>Есть 2-х мерный массив заполненный 1 и 0. Как найти крайний левый верхний элемент, котороый равен 0?

А что приоритетней верхота или левизна? Исходя оттуда и порядок для поиска по диагоналям либо сверху либо слева.
Re[2]: Поиск верхнего левого элемента
От: Аноним  
Дата: 25.05.10 09:49
Оценка:
Здравствуйте, batu, Вы писали:

B>А что приоритетней верхота или левизна? Исходя оттуда и порядок для поиска по диагоналям либо сверху либо слева.


сначала верхота, а потом левизна, т.е. если (0,0) не подходит, то смотрим (1,0), потом (0,1) и наконец (1,1)
Re[3]: Поиск верхнего левого элемента
От: batu Украина  
Дата: 25.05.10 10:19
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, batu, Вы писали:


B>>А что приоритетней верхота или левизна? Исходя оттуда и порядок для поиска по диагоналям либо сверху либо слева.


А>сначала верхота, а потом левизна, т.е. если (0,0) не подходит, то смотрим (1,0), потом (0,1) и наконец (1,1)

(1,1) несколько на другой диагонали лежит.
For i=0 to n-1
for j=0 to i
if a((i-j), j)=0 Then Exit
next
next
Где-то так...
Re[3]: Поиск верхнего левого элемента
От: Кодт Россия  
Дата: 25.05.10 10:56
Оценка:
Здравствуйте, Аноним, Вы писали:

B>>А что приоритетней верхота или левизна? Исходя оттуда и порядок для поиска по диагоналям либо сверху либо слева.

А>сначала верхота, а потом левизна, т.е. если (0,0) не подходит, то смотрим (1,0), потом (0,1) и наконец (1,1)

Есть несколько подходов разной степени замороченности.
Начнём с самого простого.

Пусть наша матрица имеет размер sx×sy.
Это значит, что в ней sx+sy-1 диагоналей.
Для матрицы 5×3 будут 5+3-1=7 штук:
  / / / / / / /
 0 1 2 3 4 / /
/ / / / / / /
 1 2 3 4 5 /
/ / / / / /
 2 3 4 5 6
/ / / / /

Код на питоне (демонстрация алгоритма). Перепереть на си или другой язык — труда не составит, надеюсь.
def traverse(sx,sy) :
  ''' функция возвращает поток координат (x,y) элементов по диагоналям '''
  for d in range(sx+sy-1) : # d - номер диагонали (0..6)
    # начало диагонали (x0,y0)
    if d < sx :
      x0,y0 = d,0 # начнём с верхнего края (0..4)
    else :
      x0,y0 = sx-1,d-sx+1 # начнём с правого края (5..6)
    # длина диагонали
    n = min(x0+1, sy-y0) # идём до краёв x0..0 и y0..sy-1, куда быстрее придём?
    # перебираем элементы!
    for i in range(n) :
      x,y = x0-i,y0+i
      print "очередной элемент:", (x,y)
      yield (x,y) # выдаём наружу
    # конец диагонали
  # конец диагоналей
# конец функции


Более сложный подход — найти аналитическое выражение для нумерации элементов, т.е. функцию xy(i) : [0…sx·sy) → [0…sx)×[0…sy)
Перекуём баги на фичи!
Re[3]: Поиск верхнего левого элемента
От: vadimcher  
Дата: 25.05.10 15:18
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, batu, Вы писали:


B>>А что приоритетней верхота или левизна? Исходя оттуда и порядок для поиска по диагоналям либо сверху либо слева.


А>сначала верхота, а потом левизна, т.е. если (0,0) не подходит, то смотрим (1,0), потом (0,1) и наконец (1,1)


Как это? Ну ладно, а что "важнее" (10,0) или (0,1) (если все (0,0)-(9,0) заполнены единицами) -- обе самые лево-верхние?

А вот зайца кому, зайца-выбегайца?!
Re[4]: Поиск верхнего левого элемента
От: conraddk Россия  
Дата: 27.05.10 14:30
Оценка:
Здравствуйте, Кодт, Вы писали:

К>Более сложный подход — найти аналитическое выражение для нумерации элементов, т.е. функцию xy(i) : [0…sx·sy) > [0…sx)?[0…sy)


http://rsdn.ru/forum/etude/904471.aspx
Автор: conraddk
Дата: 18.11.04


>В двумерном получается

>f(x1,x2) = (x1+x2)(x1+x2+1)/2 + x1
D.K. << RSDN@Home 1.2.0 alpha 4 rev. 1472>>
Все на свете должно происходить медленно и неправильно...
Re[5]: Поиск верхнего левого элемента
От: Кодт Россия  
Дата: 27.05.10 15:56
Оценка: +1
Здравствуйте, conraddk, Вы писали:

К>>Более сложный подход — найти аналитическое выражение для нумерации элементов, т.е. функцию xy(i) : [0…sx·sy) > [0…sx)?[0…sy)


C>http://rsdn.ru/forum/etude/904471.aspx
Автор: conraddk
Дата: 18.11.04


>>В двумерном получается

>>f(x1,x2) = (x1+x2)(x1+x2+1)/2 + x1

Неа. У тебя формула для бесконечного треугольника, а надо — для конечного прямоугольника (и даже не квадрата).
Перекуём баги на фичи!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.