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

  • Автор темы MaTBeu
  • Дата начала
M

MaTBeu

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

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

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

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

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

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

Nikman

Гость
#2
Если ты не можешь перевести алгоритм из C++ в Assembler, то сделай проше:
например у тебя есть программа на C++, ты берешь компилятор С++ ставишь там флаг {генерировать ассемблерный код}, потом этот код подправляешь и сдаешь.
P.S В MS Visual Studio это делается так
Project->Properties->Configuration Properties->C/C++->Otput Files->Assembler Output = Assembly-Only Listing (/FA) (только выключи оптимизацию, а то ничего не разберешь в асме)
 
04.09.2006
2 566
2
#3
Я уверен, есть более простой алгоритм.
А чем этот не устраивает? Вполне нормальный алгоритм. Единственное что не нужно делать, так это создавать второй массив. Достаточно хранить координаты точки, имеющей минимальное число соседей, и непосредственно число соседей. Однако если таких точек может быть >1, то тут массив понадобится.
А без перебора всех точек тут не обойтись. Единственным случаем уменьшения перебора является случай, когда будет найдена точка не имеющая соседей. Хотя если нужно видеть все такие точки, то придется перебирать весь массив
 
M

MaTBeu

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


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


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

И еще. Вот вам кусок кода. Это поиск минимального элемента. Что самое интересное, индекс минимального элемента записывается, а значение - нет. Посмотрите, может чего подскажете.
Код:
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
 
M

MaTBeu

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

MaTBeu

Гость
#6
Все, прога сделана. Спсибо за помощь. Топ можно закрывать. Но на всякий пожарный подскажите как выводить числа больше 9. Это так, на будущее. В своей проге я чуток по мутному сделал. Заранее спасибо.
 
04.09.2006
2 566
2
#7
А насчет второго массива, его нужно создать по-любому, потому что исходная матрица вводится с клавы и ты никогда не знаешь, сколько у той или иной точки будет соседей, и будут ли среди них точки с одинаковым количеством соседей.
вторую матрицу размером с первую точно создавать не нужно
А сделать прогу более рациональной можно проверяя только точки в диапазоне, а не все подряд.
Так это же очевидно!
Но вопрос о выводе чисел больших 9 отался открытым.
Выводить можно только цифры... Т.е. нужно из числа выделить цифры, каждую из которых вывести на экран. Думаю в сети таких подпрограмм много