|
2 / 2 / 0
Регистрация: 16.05.2012
Сообщений: 39
|
||||||
Циклический сдвиг матрицы16.05.2012, 22:55. Показов 21657. Ответов 18
Метки нет (Все метки)
Всем доброго дня. Программа располагает двумерный массив в динамичной памяти и сдвигает его на Т элементов влево.
вопрос вот в чем: Как изменить void func(int **arr, int size, int stift) , чтобы сдвигало массив вправо, а не влево? Код:
0
|
||||||
| 16.05.2012, 22:55 | |
|
Ответы с готовыми решениями:
18
Циклический сдвиг матрицы Циклический сдвиг матрицы MxN Выполнить циклический сдвиг столбцов матрицы |
|
1066 / 583 / 87
Регистрация: 03.12.2009
Сообщений: 1,255
|
||||||
| 16.05.2012, 23:11 | ||||||
|
Незнаю поможет Вам или нет!!
Вот завалялась программа, сдвигает элементы матрицы вправо и вниз, в зависимости от выбраного режима! Матрица считывается и записывается в файл
Не по теме:
1
|
||||||
|
2 / 2 / 0
Регистрация: 16.05.2012
Сообщений: 39
|
|
| 17.05.2012, 17:20 [ТС] | |
|
довольно сложное что-то, громоздкое и совсем непонятное..
мне бы сам алгоритм, как меняется строка и столбец при сдвиге вправо. а код и сам напишу.
0
|
|
|
179 / 127 / 25
Регистрация: 12.01.2012
Сообщений: 623
|
|
| 17.05.2012, 18:41 | |
|
просто обменивай соседние элементы данной строки по следующему алгоритму
std::swap( matrix[i][j], matrix[i][ ( j + shiftValue ) % MATRIX_SIZE ] ); std::swap() - это стандартная функция библиотеки алгоритмов. Там вообще много полезных алгоритмов, для вашей задачи, например, идеально подойдёт std::rotate()
0
|
|
|
2 / 2 / 0
Регистрация: 16.05.2012
Сообщений: 39
|
|
| 17.05.2012, 23:51 [ТС] | |
|
нельзя использовать стандартные функции
что за алгоритм. Объясните пожалуйста
0
|
|
|
179 / 127 / 25
Регистрация: 12.01.2012
Сообщений: 623
|
||||||
| 18.05.2012, 00:46 | ||||||
|
Что за алгоритм я написал, я и сам не знаю, но принцип таков. Новая позиция элемента равна (текущая позиция элемента + величина сдвига) % размер строки массива. Можете сами на листочке проверить. Может есть и более сложные и эффективные алгоритмы, но этот очевидно самый простой. Вот его пример. Правда тут использованы некоторые стандартные функции, но я считаю их использование легальным
0
|
||||||
|
2 / 2 / 0
Регистрация: 16.05.2012
Сообщений: 39
|
|
| 18.05.2012, 01:14 [ТС] | |
|
(текущая позиция элемента + величина сдвига) % размер строки
это нахождение позиции столбца. как на счет строки?
0
|
|
|
179 / 127 / 25
Регистрация: 12.01.2012
Сообщений: 623
|
|
| 18.05.2012, 01:17 | |
|
При сдвиге вправо по-моему изменяется только положение столбцов определенной строки или вы имеете в виду, что сдвиг матрицы этой матрицы на одно поле вправо должен быть таким?
from 1 2 3 4 to 4 1 3 2 Объясните, как вы вообще представляете сдвиг матрицы
0
|
|
|
2 / 2 / 0
Регистрация: 16.05.2012
Сообщений: 39
|
|
| 18.05.2012, 09:14 [ТС] | |
|
1 2 3
4 5 6 7 8 9 сдвигаем на 4 вправо и получаем: 6 7 8 9 1 2 3 4 5 a[1][1] ->a[2][2]
0
|
|
|
179 / 127 / 25
Регистрация: 12.01.2012
Сообщений: 623
|
|
| 18.05.2012, 11:50 | |
|
Ясно, я так и подозревал. Но алгоритм, в принципе, будет тот же самый как и для одной строки, ведь даже четырёхмерный массив занимает в виртуальной памяти непрерывную последовательность элементов, которую можно рассматривать как одну строку. С арифметикой указателей знакомы? Вот через неё можно рассматривать этот массив, как единую строку. Есть, конечно, формулы для вычисления через индексы, но поверьте мне - они будут совсем некрасивы и непонятны
0
|
|
|
2 / 2 / 0
Регистрация: 16.05.2012
Сообщений: 39
|
|
| 18.05.2012, 11:54 [ТС] | |
|
с указателями знаком, но как-то плохо представляю себе двумерный массив строкой.
можно пример?
0
|
|
|
179 / 127 / 25
Регистрация: 12.01.2012
Сообщений: 623
|
||||||
| 18.05.2012, 17:45 | ||||||
|
Блин, вы меня вечно разоблачаете. С указательной арифметикой выйдет всё тоже не так просто, он вроде оказывается не совсем беспрерывный, лучше через индексы, по старой доброй формуле
![]() main.cpp
Но вот копировать всю всю матрицу в отдельные временный массив не обязательно, достаточно создать массив последних ( MATRIX_SIZE - shiftValue ) элементов, а далее применить тот "мой" алгоритм, а затем скоировать данные из временного массива в начало измененной матрицы. А лучше меня не слушать вообще, а просто тупо скопипастить первый попавшийся алгоритм с гугла а то меня несёт
0
|
||||||
|
2 / 2 / 0
Регистрация: 16.05.2012
Сообщений: 39
|
||||||
| 19.05.2012, 14:56 [ТС] | ||||||
|
если бы это было в гугле, я бы тут не писал. Там в основном одномерные массивы.
либо стандартные функции. вот например мой код сдвига влево:
изменение i: i+(stift+j)/size (строка) изменение j: (stift+j)%size (при условии что сдвиг больше размера строки if(iPos>=size) ) нужен точно такой же код только вправо) и всё ![]() Добавлено через 17 часов 37 минут помогите кто-нибудь *хнык*
0
|
||||||
|
179 / 127 / 25
Регистрация: 12.01.2012
Сообщений: 623
|
||||||
| 19.05.2012, 16:16 | ||||||
|
Ну так сдвиг влево - это все равно что вправо, только на период ( размер массива - Величина сдвига влево ) или что-то вроде того
![]() Вот написал, понимаю - это далекоо не идеал, но работает-таки
ЗЫ совсем забыл в конце функции лучше освобождать динамически выделенную память, а то утечка памяти ведь
0
|
||||||
|
2 / 2 / 0
Регистрация: 16.05.2012
Сообщений: 39
|
||||||||||||||||
| 20.05.2012, 16:58 [ТС] | ||||||||||||||||
|
код не рабочий
![]() Добавлено через 8 часов 34 минуты
ага... и где мне тогда взять значение columns для функции сдвига потом? Добавлено через 1 час 25 минут
0
|
||||||||||||||||
|
179 / 127 / 25
Регистрация: 12.01.2012
Сообщений: 623
|
||||||
| 20.05.2012, 19:06 | ||||||
Сообщение было отмечено Вечный_Студент как решение
Решение
Ну так вы неправильно выполняете выделение памяти под массив
![]() Надо так
1
|
||||||
|
2 / 2 / 0
Регистрация: 16.05.2012
Сообщений: 39
|
|
| 20.05.2012, 22:54 [ТС] | |
|
у вас кстати второй раз ошибка. Дважды объявляете переменную i
спасибо все прекрасно работает :dance3:
0
|
|
|
0 / 0 / 0
Регистрация: 19.10.2016
Сообщений: 16
|
|
| 20.12.2016, 01:24 | |
|
Buckstabue, а как сделать чтобы сдвиг был еще и вниз?
0
|
|
|
0 / 0 / 0
Регистрация: 06.09.2019
Сообщений: 10
|
|
| 12.09.2019, 18:28 | |
|
У матрицы сдвигаются строки которые выходят за границу и переходят на следующую, как это исправить? Чтоб колонки сдвигались не меняя позиции строк?
0
|
|
| 12.09.2019, 18:28 | |
|
Помогаю со студенческими работами здесь
19
Осуществить циклический сдвиг матрицы по условию Циклический сдвиг элементов прямоугольной матрицы Осуществить циклический сдвиг элементов прямоугольной матрицы
Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога
Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip
https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11680&d=1772460536
Одним из. . .
|
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
|
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
|
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
|
|
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога
Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
|
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование
. \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json>
Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом.
# Check if. . .
|
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так:
https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347
Основана на STM32F303RBT6.
На борту пять. . .
|
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
|