Форум АНТИЧАТ

Форум АНТИЧАТ (https://forum.antichat.xyz/index.php)
-   С/С++, C#, Delphi, .NET, Asm (https://forum.antichat.xyz/forumdisplay.php?f=24)
-   -   Циклический сдвиг С++ (https://forum.antichat.xyz/showthread.php?t=151949)

Mozy 28.10.2009 22:15

Циклический сдвиг С++
 
Всем доброго времени суток
потребовалось реализовать шаблон функции циклического сдвига в любую сторону двухмерного квадратного массива.

Код:

Работающие шаблоны приведены ниже

Chrek625 29.10.2009 02:09

По моему мнению так не бывает чтобы ничего не работало...
Что именно не работает скажите для начала?
И код полностью выложите а не фрагмент.

Lee_fx 29.10.2009 11:54

Код:

#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 вправо


Mozy 29.10.2009 15:35

Цитата:

Сообщение от 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 вправо


Чувак спасибо
Классно, наконец я увидел реализацию с разворотами
Только проблема в том ,что это для одномерного массива,
а мне бы для двухмерного квадратного

Lee_fx 29.10.2009 17:49

Цитата:

Сообщение от 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
};

Mozy 30.10.2009 12:05

Цитата:

Сообщение от 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
};

а вверх вниз ?

Lee_fx 30.10.2009 16:07

В таком случае stl похоже не поможет.
Повелосипедить чуток - создать пустую копию и забить как надо =)

Mozy 13.11.2009 23:49

Итак
шаблон функции я реализовал
Код:

#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:51

Вот ещё один вариант написал
(самописный, без испоьзования 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;
        }
}

Всем спасибо за проявленное внимание


Время: 13:24