|
2 / 2 / 0
Регистрация: 16.05.2012
Сообщений: 39
|
||||||
Циклический сдвиг матрицы16.05.2012, 22:55. Показов 21625. Ответов 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
Осуществить циклический сдвиг матрицы по условию Циклический сдвиг элементов прямоугольной матрицы Осуществить циклический сдвиг элементов прямоугольной матрицы
Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Первый деплой
lagorue 16.01.2026
Не спеша развернул своё 1ое приложение в kubernetes.
А дальше мне интересно создать 1фронтэнд приложения и 2 бэкэнд приложения
развернуть 2 деплоя в кубере получится 2 сервиса и что-бы они. . .
|
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ *
Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам
Кирхгофа, решает её и находит:
токи, напряжения и их 1 и 2 производные при t = 0;. . .
|
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым.
Но восстановить их можно так.
Для этого понадобится консольная утилита. . .
|
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
|
|
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
|
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11
— это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
|
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11
Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
|
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
|