Antichat снова доступен.
Форум Antichat (Античат) возвращается и снова открыт для пользователей.
Здесь обсуждаются безопасность, программирование, технологии и многое другое.
Сообщество снова собирается вместе.
Новый адрес: forum.antichat.xyz
 |

28.10.2009, 22:15
|
|
Познающий
Регистрация: 15.03.2009
Сообщений: 77
Провел на форуме: 984248
Репутация:
73
|
|
Циклический сдвиг С++
Всем доброго времени суток
потребовалось реализовать шаблон функции циклического сдвига в любую сторону двухмерного квадратного массива.
Код:
Работающие шаблоны приведены ниже
Последний раз редактировалось Mozy; 18.11.2009 в 00:01..
|
|
|

29.10.2009, 02:09
|
|
Участник форума
Регистрация: 06.06.2006
Сообщений: 163
Провел на форуме: 1025198
Репутация:
11
|
|
По моему мнению так не бывает чтобы ничего не работало...
Что именно не работает скажите для начала?
И код полностью выложите а не фрагмент.
|
|
|

29.10.2009, 11:54
|
|
Познающий
Регистрация: 27.09.2008
Сообщений: 57
Провел на форуме: 265628
Репутация:
23
|
|
Код:
#include <algorithm>
template < typename T >
void _rotate(T *arr, int size, int step, bool right) {
if(right)
for(int i=0; i<size; ++i) rotate(arr[i], arr[i]+size-step, arr[i]+size);
else
for(int i=0; i<size; ++i) rotate(arr[i], arr[i]+step, arr[i]+size);
}
...
_rotate(matrix, 5, 2, 0); // Сдвинуть на 2 влево
_rotate(matrix, 5, 1, 1); // Сдвинуть на 1 вправо
|
|
|

29.10.2009, 15:35
|
|
Познающий
Регистрация: 15.03.2009
Сообщений: 77
Провел на форуме: 984248
Репутация:
73
|
|
Сообщение от Lee_fx
Код:
#include <algorithm>
template < typename T >
void _rotate(T *arr, int size, int step, bool right) {
if(right)
for(int i=0; i<size; ++i) rotate(arr[i], arr[i]+size-step, arr[i]+size);
else
for(int i=0; i<size; ++i) rotate(arr[i], arr[i]+step, arr[i]+size);
}
...
_rotate(matrix, 5, 2, 0); // Сдвинуть на 2 влево
_rotate(matrix, 5, 1, 1); // Сдвинуть на 1 вправо
Чувак спасибо
Классно, наконец я увидел реализацию с разворотами
Только проблема в том ,что это для одномерного массива,
а мне бы для двухмерного квадратного
|
|
|

29.10.2009, 17:49
|
|
Познающий
Регистрация: 27.09.2008
Сообщений: 57
Провел на форуме: 265628
Репутация:
23
|
|
Сообщение от Mozy
Чувак спасибо
Классно, наконец я увидел реализацию с разворотами
Только проблема в том ,что это для одномерного массива,
а мне бы для двухмерного квадратного
это как раз для двумерного [n][n]
Пр.
int matrix[5][5] = {
1,2,3,4,5,
6,7,8,9,1,
1,2,3,4,5,
6,7,8,9,1,
6,9,7,2,6
};
|
|
|

30.10.2009, 12:05
|
|
Познающий
Регистрация: 15.03.2009
Сообщений: 77
Провел на форуме: 984248
Репутация:
73
|
|
Сообщение от Lee_fx
это как раз для двумерного [n][n]
Пр.
int matrix[5][5] = {
1,2,3,4,5,
6,7,8,9,1,
1,2,3,4,5,
6,7,8,9,1,
6,9,7,2,6
};
а вверх вниз ?
|
|
|

30.10.2009, 16:07
|
|
Познающий
Регистрация: 27.09.2008
Сообщений: 57
Провел на форуме: 265628
Репутация:
23
|
|
В таком случае stl похоже не поможет.
Повелосипедить чуток - создать пустую копию и забить как надо =)
|
|
|

13.11.2009, 23:49
|
|
Познающий
Регистрация: 15.03.2009
Сообщений: 77
Провел на форуме: 984248
Репутация:
73
|
|
Итак
шаблон функции я реализовал
Код:
#include <vector>
#include <algorithm>
enum Direction//перечисление сторон
{
Right = 0,
Left,
Up,
Down
};
template <typename T>
inline void shlrud(T **array, int size, int step, Direction dir)
{
vector<T> _v;//объявление вектора
for (int i =0; i < size; i++)
{
int j;
_v.clear();//очищаем вектор
for (j = 0; j < size; j++)
{
switch (dir)
{
case Right:
case Left:
_v.push_back(array[i][j]);//забиваем в вектор строчку массива
break;
case Down:
case Up:
_v.push_back(array[j][i]);//забиваем в вектор строчку массива
break;
}
}
switch (dir)
{
case Right:
case Down:
rotate(_v.begin(),//делаем циклический сдвиг
_v.end()-step,//методом разворотов
_v.end());
break;
case Left:
case Up:
rotate(_v.begin(),//делаем циклический сдвиг
_v.begin()+step,//методом разворотов
_v.end());
break;
}
for (j = 0; j < size; j++)
{
switch (dir)
{
case Right:
case Left:
array[i][j] = _v[j];//возвращаем обработанную строчку в массив
break;
case Down:
case Up:
array[j][i] = _v[j];//возвращаем обработанную строчку в массив
break;
}
}
}
}
Пользуйтесь на здоровье
Но проблема в другом:
Оказывается надо было написать без использования STL.
Последний раз редактировалось Mozy; 17.11.2009 в 23:52..
|
|
|

17.11.2009, 23:51
|
|
Познающий
Регистрация: 15.03.2009
Сообщений: 77
Провел на форуме: 984248
Репутация:
73
|
|
Вот ещё один вариант написал
(самописный, без испоьзования stl)
Код:
template <typename T>
void Reverse(T **Massive,int size, int StartElem, int FinishElem,int direction)
{
int i,j;
T t;
switch(direction){
/*Горизонтально*/
case 1:
case -1:
for(j=0;j<size;j++){
for (i=0;i<=(FinishElem-StartElem)/2;i++)
{
t=Massive[j][StartElem+i];
Massive[j][StartElem+i]=Massive[j][FinishElem-i];
Massive[j][FinishElem-i]=t;
}
}
break;
/*Вертикально*/
case 2:
case -2:
for(j=0;j<size;j++){
for (i=0;i<=(FinishElem-StartElem)/2;i++)
{
t=Massive[StartElem+i][j];
Massive[StartElem+i][j]=Massive[FinishElem-i][j];
Massive[FinishElem-i][j]=t;
}
}
break;
}
}
template <typename T>
void cyclicShift(T **Massive, int size, int k,int direction)
{
switch(direction){
case 1:
case 2:
Reverse(Massive,size,0, size-1, direction); //разворачиваем массив
Reverse(Massive,size,0, k-1, direction); //разворачиваем первые к элементов
Reverse(Massive,size,k, size-1, direction); //разворачиваем последние n-k эллементов
break;
case -1:
case -2:
Reverse(Massive,size,0, k-1, direction); //разворачиваем первые к элементов
Reverse(Massive,size,k, size-1, direction); //разворачиваем последние n-k эллементов
Reverse(Massive,size,0, size-1, direction); //разворачиваем массив
break;
}
}
Всем спасибо за проявленное внимание
|
|
|
|
 |
Похожие темы
|
| Тема |
Автор |
Раздел |
Ответов |
Последнее сообщение |
|
[c/c++] Новичкам: задаем вопросы
|
_Great_ |
С/С++, C#, Delphi, .NET, Asm |
5420 |
17.06.2010 13:33 |
|
Оценка эффективности и быстродействия различных алгоритмов.
|
c0n Difesa |
С/С++, C#, Delphi, .NET, Asm |
18 |
19.10.2009 15:21 |
|
Assembler FAQ
|
GlobalRave |
С/С++, C#, Delphi, .NET, Asm |
2 |
15.02.2009 18:59 |
|
Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
|
|
|
|