Здравствуйте, Аноним, Вы писали:
А>Здравствуйте!
А>Есть 2-х мерный массив заполненный 1 и 0. Как найти крайний левый верхний элемент, котороый равен 0?
А что приоритетней верхота или левизна? Исходя оттуда и порядок для поиска по диагоналям либо сверху либо слева.
Re[2]: Поиск верхнего левого элемента
От:
Аноним
Дата:
25.05.10 09:49
Оценка:
Здравствуйте, batu, Вы писали:
B>А что приоритетней верхота или левизна? Исходя оттуда и порядок для поиска по диагоналям либо сверху либо слева.
сначала верхота, а потом левизна, т.е. если (0,0) не подходит, то смотрим (1,0), потом (0,1) и наконец (1,1)
Здравствуйте, Аноним, Вы писали:
А>Здравствуйте, 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
Где-то так...
Здравствуйте, Аноним, Вы писали:
B>>А что приоритетней верхота или левизна? Исходя оттуда и порядок для поиска по диагоналям либо сверху либо слева. А>сначала верхота, а потом левизна, т.е. если (0,0) не подходит, то смотрим (1,0), потом (0,1) и наконец (1,1)
Есть несколько подходов разной степени замороченности.
Начнём с самого простого.
Пусть наша матрица имеет размер sx×sy.
Это значит, что в ней sx+sy-1 диагоналей.
Для матрицы 5×3 будут 5+3-1=7 штук:
Код на питоне (демонстрация алгоритма). Перепереть на си или другой язык — труда не составит, надеюсь.
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)
Здравствуйте, Аноним, Вы писали:
А>Здравствуйте, batu, Вы писали:
B>>А что приоритетней верхота или левизна? Исходя оттуда и порядок для поиска по диагоналям либо сверху либо слева.
А>сначала верхота, а потом левизна, т.е. если (0,0) не подходит, то смотрим (1,0), потом (0,1) и наконец (1,1)
Как это? Ну ладно, а что "важнее" (10,0) или (0,1) (если все (0,0)-(9,0) заполнены единицами) -- обе самые лево-верхние?
Здравствуйте, Кодт, Вы писали:
К>Более сложный подход — найти аналитическое выражение для нумерации элементов, т.е. функцию xy(i) : [0…sx·sy) > [0…sx)?[0…sy)
Здравствуйте, conraddk, Вы писали:
К>>Более сложный подход — найти аналитическое выражение для нумерации элементов, т.е. функцию xy(i) : [0…sx·sy) > [0…sx)?[0…sy)
C>http://rsdn.ru/forum/etude/904471.aspx