Массивы в ассемблере

Тема в разделе "Другие", создана пользователем MaTBeu, 19 мар 2008.

  1. MaTBeu

    MaTBeu Гость

    Здрасте. Вопрос у меня ламерский. Асм я только начал изучать, и с одним из первых заданий сразу же возникли проблемы. Короче задание у мя такое:
    Дано множество точек на плоскости. Каждая точка может быть центром круга, заданного радиуса. Выяснить, какая точка, если нарисовать из нее круг, накроет этим кругом наименьшее количество других точек.

    Короче со средствами ассемблера я разобрался. Догнать алгоритм не могу. Пробовал написать алгоритм на С++, а потом реализовать его на асме, токо ничего у меня не получилось.

    ************************
    Моя версия алгоритма (слишком сложна)

    Находим точку в матрице (матрица из "0" и "1". "1" - это точка), и проверяем, есть ли у нее соседи в диапазоне, равном радиусу круга. Если такие точки есть, то считаем их и заносим количество накрываемых точек в массив (отдельный), а когда пройдем всю матрицу, сравниваем элементы второго массива и находим среди них минимум.

    ************************

    Я уверен, есть более простой алгоритм. Подскажите плиз!
    Заранее спасибо.
     
  2. Nikman

    Nikman Гость

    Если ты не можешь перевести алгоритм из C++ в Assembler, то сделай проше:
    например у тебя есть программа на C++, ты берешь компилятор С++ ставишь там флаг {генерировать ассемблерный код}, потом этот код подправляешь и сдаешь.
    P.S В MS Visual Studio это делается так
    Project->Properties->Configuration Properties->C/C++->Otput Files->Assembler Output = Assembly-Only Listing (/FA) (только выключи оптимизацию, а то ничего не разберешь в асме)
     
  3. European

    Регистрация:
    4 сен 2006
    Сообщения:
    2.580
    Симпатии:
    0
    А чем этот не устраивает? Вполне нормальный алгоритм. Единственное что не нужно делать, так это создавать второй массив. Достаточно хранить координаты точки, имеющей минимальное число соседей, и непосредственно число соседей. Однако если таких точек может быть >1, то тут массив понадобится.
    А без перебора всех точек тут не обойтись. Единственным случаем уменьшения перебора является случай, когда будет найдена точка не имеющая соседей. Хотя если нужно видеть все такие точки, то придется перебирать весь массив
     
  4. MaTBeu

    MaTBeu Гость

    Спасибо, я уже сделал. Насчет MS Visual Studio я учту. Это весьма ценные знания. Будет проще дальше проги писать. А насчет второго массива, его нужно создать по-любому, потому что исходная матрица вводится с клавы и ты никогда не знаешь, сколько у той или иной точки будет соседей, и будут ли среди них точки с одинаковым количеством соседей. Программа просто гибче будет. Мы только начали изучать асм, но от нас уже требуют гибкие проги, фактически не имеющие исключений.


    ПыСы: у меня вот еще вопрос: когда у точки больше 9 соседей, количество неправильно выводится. Ну ASCII-кода у 10 десятичной нету. Как мне быть, чтобы вывдились корректные данные?


    А сделать прогу более рациональной можно проверяя только точки в диапазоне, а не все подряд. Например, если точка стоит на на позиции (1,1), то нужно проверять только точки в диапазоне от (0,0) до (4,4) (это если радиус круга равен 3). Это несколько усложнит программу, но избавит от лишних проверок.

    И еще. Вот вам кусок кода. Это поиск минимального элемента. Что самое интересное, индекс минимального элемента записывается, а значение - нет. Посмотрите, может чего подскажете.
    Код (Text):
    Analizing proc near

    xor dx, dx
    xor bx, bx
    mov cx, 12  ;счетчик цикла
    mov bx, cx

    a:
    mov al, info[bx]     ;info - массив с количеством соседей каждой точки
    mov dl, min       ;минимальное количество соседей
    cmp dl, al
    jge a1
    inc bx
    loop a
    jmp a2
    a1:
    mov min, al      ;вот тут походу не присваивается почему-то
    mov index, bx     ;индекс точки с минимальным количством соседй
    inc bx
    jmp a

    a2:
    call WrStr        ;функция вывода на экран

    mov ah, 4ch
    int 21h
    Analizing endp
     
  5. MaTBeu

    MaTBeu Гость

    Все с минимумом разобрался. Но вопрос о выводе чисел больших 9 отался открытым. Что подскажете?
     
  6. MaTBeu

    MaTBeu Гость

    Все, прога сделана. Спсибо за помощь. Топ можно закрывать. Но на всякий пожарный подскажите как выводить числа больше 9. Это так, на будущее. В своей проге я чуток по мутному сделал. Заранее спасибо.
     
  7. European

    Регистрация:
    4 сен 2006
    Сообщения:
    2.580
    Симпатии:
    0
    вторую матрицу размером с первую точно создавать не нужно
    Так это же очевидно!
    Выводить можно только цифры... Т.е. нужно из числа выделить цифры, каждую из которых вывести на экран. Думаю в сети таких подпрограмм много
     
Загрузка...
Похожие Темы - Массивы ассемблере
  1. Искушенный
    Ответов:
    0
    Просмотров:
    430
  2. Искушенный
    Ответов:
    1
    Просмотров:
    416
  3. Искушенный
    Ответов:
    1
    Просмотров:
    383
  4. Rpp
    Ответов:
    1
    Просмотров:
    809
  5. romanovbadboy2
    Ответов:
    0
    Просмотров:
    668

Поделиться этой страницей