Всем доброго времени суток потребовалось реализовать шаблон функции циклического сдвига в любую сторону двухмерного квадратного массива. Code: Работающие шаблоны приведены ниже
По моему мнению так не бывает чтобы ничего не работало... Что именно не работает скажите для начала? И код полностью выложите а не фрагмент.
Code: #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 };
В таком случае stl похоже не поможет. Повелосипедить чуток - создать пустую копию и забить как надо =)
Итак шаблон функции я реализовал Code: #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) Code: 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; } } Всем спасибо за проявленное внимание