· Начало · Статистика · WASM.RU · Noir.Ru ·

 WASM Phorum (Оффлайн - 24.11.2003) —› WASM.A&O —› Поворот массива

<< . 1 . 2 .

Посл.отвђт Сообщенiе


Дата: Ноя 10, 2003 10:32:18 · Поправил: masquer

Я как-то так транспонировал матрицу 4х4, строчки последовательно расположены. Не знаю, правда, как это к бейсику можно привязать и размер должен быть одинаковым и кратным 4
	movq mm0, a
	movq mm1, b
	movq mm2, mm0
	punpcklbw mm0, mm1
	punpckhbw mm2, mm1
	movq mm1, mm0
	movq mm3, mm2
	punpcklbw mm0, mm2
	punpckhbw mm1, mm3
	movq mm2, mm0
	psrld mm2, 16
	pslld mm0, 16
	por mm0, mm2
	movq mm2, mm1
	psrld mm2, 16
	pslld mm1, 16
	por mm1, mm2
	movq qword ptr [tm], mm1
	movq qword ptr [tm+8], mm0


Дата: Ноя 10, 2003 19:10:41 · Поправил: h0kum

Toxic
А тебе надо именно поворот осуществить? Может, препод имел в виду транспонирование матрицы?
Да именно поворот, вот задание:
Матрицу NхN повернуть (без использования вспомогательного массива) на:
а) на 90 гр. вправо б) на 180 гр. вправо в) на 90 влево


Дата: Ноя 10, 2003 19:17:34

volodya
http://www.planet-source-code.com/vb/scripts/ShowCode.asp?txtCodeId=4 7 9&lngWId=3
там через массив :(


Дата: Ноя 10, 2003 21:40:45

h0kum
Есть у меня в голове один вариантик без доп массивов, но он довольно сложный, счас попробую додумать и изложу..


Дата: Ноя 11, 2003 01:44:57

Это поворот на 90:
rotate90:;(array +4, size +8)
	mov ebx,[esp+4]
	mov edx,[esp+8]
	dec edx
	lea ecx,[ebx+edx]
	imul edx,[esp+8]
	lea esi,[ebx+edx]
	add edx,ecx
	mov ebp,[esp+8]
	jmp .l0
    .l1:
	mov edi,ebp
	jmp .l2
    .l3:
	inc ebx
	dec edx
	add ecx,[esp+8]
	sub esi,[esp+8]
    .l2:
	mov al,[ebx]
	xchg al,[ecx]
	xchg al,[edx]
	xchg al,[esi]
	mov [ebx],al
	dec edi
	jg .l3	
	xchg esi,edx
	xchg edx,ecx
	xchg ecx,ebx
	inc ebx
	dec edx
	add ecx,[esp+8]
	sub esi,[esp+8]
	dec ebp
    .l0:
	dec ebp
	jg .l1
	ret 8		

А для поворота на 180 нужно внести такие изменения:
    .l2:
        mov al,[ebx]
        xchg al,[edx]
        mov [ebx],al
        mov al,[ecx]
        xchg al,[esi]
        mov [ecx],al
	dec edi
	jg .l3	


Дата: Ноя 13, 2003 22:29:01

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

SUB move (i, k, c)
IF c <= 4 THEN
t = mas(i, k)
c = c + 1
IF op >= 0 THEN
CALL move(k, m + 1 - i, c)
mas(k, m + 1 - i) = t
ELSE
CALL move(m + 1 - k, i, c)
mas(m + 1 - k, i) = t
END IF
END IF
END SUB

<< . 1 . 2 .


Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.045