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

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

. 1 . 2 . >>

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


Дата: Ноя 9, 2003 17:36:37

Люди подскажите нормальный алгоритм для поворота массива на 90 гр. в право или налево, и на 180 гр. но без использования другого массива!
желательно что бы это было применительно к бэйсику :)


Дата: Ноя 9, 2003 19:10:49

На сколько массив большой?
А без друго массива довольно медленно будет работать.


Дата: Ноя 9, 2003 19:43:35

размер неизвестный NxN, но врядли будут делать больше 5х5. преподу самому неинтересно будет забивать много чисел.
да уж долго, но такое задание


Дата: Ноя 9, 2003 20:03:12

Чего-то мне в голову кроме strrev ничего больше не приходит... Ведь a, b, c, d, e должны преобразоваться в e, d, c, b, a, так? Тогда через буфер в один элемент:
char * __cdecl _strrev (
        char * string
        )
{
        char *start = string;
        char *left = string;
        char ch;

        while (*string++)                 /* find end of string */
                ;
        string -= 2;

        while (left < string)
        {
                ch = *left;
                *left++ = *string;
                *string-- = ch;
        }

        return(start);
}


Тупо, медленно...


Дата: Ноя 9, 2003 21:01:15

не-е что то не то!
массив же а нет строка, должно быть так:
исходный: измененный:
123 369
456 258
789 147


Дата: Ноя 9, 2003 21:02:22

скорость не имеет значение, это просто контрольная работа :)


Дата: Ноя 9, 2003 21:04:35

Пока только поворот на 90 гр. вправо и с использованием другого массива:
Поворот происходит по следующей формуле:
[x,y] -> [N-y,x]
где x - строки, y - столбцы, N - размерность.
 mov cx,[N] ;y
m_01:
 mov bp,[N] ;x
m_02:
 mov ax,cx
 mul [N]
 add ax,bp
 mov bx,ax ;bx=y*N+x
 mov al,[si+bx]
 push ax
 mov ax,bp
 inc ax
 mul [N]
 sub ax,cx
 mov bx,ax ;bx=(x*N)+(N-y)
 pop ax
 mov [di+bx],al
 dec bp
 jnz m_02
 dec cx
 jnz m_01

si - входной массив
di - выходной


Дата: Ноя 9, 2003 21:11:58

для поворота влево надо воплотить такую формулу:
[x,y] -> [y, N-x]


Дата: Ноя 9, 2003 21:22:51

Извини, туплю. Объясни, как ты из
123 получил 369
456 -> 258
789 -> 147
Формулу преобразования можешь написать?


Дата: Ноя 9, 2003 21:30:27

он имел ввиду следующее: элемент массива с номером 1 занимает место элемента 3, элем 2 -> 6 и т.д.


Дата: Ноя 9, 2003 22:37:40

volodya
ну типа пишешь на бумаге массив и переворачиваешь листок на 90 гр. и переписываешь индексы.
я что то не думал что это сложно :)


Дата: Ноя 9, 2003 23:24:28

он имел ввиду следующее: элемент массива с номером 1 занимает место элемента 3, элем 2 -> 6 и т.д.

т.е., a b c d -> c d a b - как я и говорил.

массив же а нет строка

что ж тут не то? Строка - это тоже массив. Частный случай. И, насколько я понял Johnikum strrev твою проблему решает. Уж не думал я, что настолько сложно поинтерную арифметику к массиву пересобачить :)


Дата: Ноя 9, 2003 23:50:20

А тебе надо именно поворот осуществить? Может, препод имел в виду транспонирование матрицы?


Дата: Ноя 10, 2003 00:00:24 · Поправил: Johnikum

volodya
a b c d -> c d a b - как я и говорил
это получается отразить относительно горизонтали, а ему повернуть надо, следуя твоему описанию надо так:
a b с d -> c a d b - это поворот по часовой стрелке
a b с d -> с d a b - это поворот против часовой стрелки


Дата: Ноя 10, 2003 00:36:40

. 1 . 2 . >>


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