Просмотр полной версии : Циклический сдвиг С++
Всем доброго времени суток
потребовалось реализовать шаблон функции циклического сдвига в любую сторону двухмерного квадратного массива.
Работающие шаблоны приведены ниже
Chrek625
29.10.2009, 02:09
По моему мнению так не бывает чтобы ничего не работало...
Что именно не работает скажите для начала?
И код полностью выложите а не фрагмент.
#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 вправо
#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 вправо
Чувак спасибо
Классно, наконец я увидел реализацию с разворотами
Только проблема в том ,что это для одномерного массива,
а мне бы для двухмерного квадратного
Чувак спасибо
Классно, наконец я увидел реализацию с разворотами
Только проблема в том ,что это для одномерного массива,
а мне бы для двухмерного квадратного
это как раз для двумерного [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
};
это как раз для двумерного [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
};
а вверх вниз ?
В таком случае stl похоже не поможет.
Повелосипедить чуток - создать пустую копию и забить как надо =)
Итак
шаблон функции я реализовал
#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.
Вот ещё один вариант написал
(самописный, без испоьзования 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;
}
}
Всем спасибо за проявленное внимание
vBulletin® v3.8.14, Copyright ©2000-2026, vBulletin Solutions, Inc. Перевод: zCarot