ANTICHAT.XYZ    VIDEO.ANTICHAT.XYZ    НОВЫЕ СООБЩЕНИЯ    ФОРУМ  
Баннер 1   Баннер 2
Antichat снова доступен.
Форум Antichat (Античат) возвращается и снова открыт для пользователей. Здесь обсуждаются безопасность, программирование, технологии и многое другое. Сообщество снова собирается вместе.
Новый адрес: forum.antichat.xyz
Вернуться   Форум АНТИЧАТ > Программирование > С/С++, C#, Delphi, .NET, Asm
   
Ответ
 
Опции темы Поиск в этой теме Опции просмотра

Циклический сдвиг С++
  #1  
Старый 28.10.2009, 22:15
Аватар для Mozy
Mozy
Познающий
Регистрация: 15.03.2009
Сообщений: 77
Провел на форуме:
984248

Репутация: 73
Отправить сообщение для Mozy с помощью ICQ
По умолчанию Циклический сдвиг С++

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

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

Последний раз редактировалось Mozy; 18.11.2009 в 00:01..
 
Ответить с цитированием

  #2  
Старый 29.10.2009, 02:09
Аватар для Chrek625
Chrek625
Участник форума
Регистрация: 06.06.2006
Сообщений: 163
Провел на форуме:
1025198

Репутация: 11
По умолчанию

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

  #3  
Старый 29.10.2009, 11:54
Аватар для Lee_fx
Lee_fx
Познающий
Регистрация: 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 вправо
 
Ответить с цитированием

  #4  
Старый 29.10.2009, 15:35
Аватар для Mozy
Mozy
Познающий
Регистрация: 15.03.2009
Сообщений: 77
Провел на форуме:
984248

Репутация: 73
Отправить сообщение для Mozy с помощью ICQ
По умолчанию

Цитата:
Сообщение от 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 вправо
Чувак спасибо
Классно, наконец я увидел реализацию с разворотами
Только проблема в том ,что это для одномерного массива,
а мне бы для двухмерного квадратного
 
Ответить с цитированием

  #5  
Старый 29.10.2009, 17:49
Аватар для Lee_fx
Lee_fx
Познающий
Регистрация: 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
};
 
Ответить с цитированием

  #6  
Старый 30.10.2009, 12:05
Аватар для Mozy
Mozy
Познающий
Регистрация: 15.03.2009
Сообщений: 77
Провел на форуме:
984248

Репутация: 73
Отправить сообщение для Mozy с помощью ICQ
По умолчанию

Цитата:
Сообщение от 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
};
а вверх вниз ?
 
Ответить с цитированием

  #7  
Старый 30.10.2009, 16:07
Аватар для Lee_fx
Lee_fx
Познающий
Регистрация: 27.09.2008
Сообщений: 57
Провел на форуме:
265628

Репутация: 23
По умолчанию

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

  #8  
Старый 13.11.2009, 23:49
Аватар для Mozy
Mozy
Познающий
Регистрация: 15.03.2009
Сообщений: 77
Провел на форуме:
984248

Репутация: 73
Отправить сообщение для Mozy с помощью ICQ
Arrow

Итак
шаблон функции я реализовал
Код:
#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..
 
Ответить с цитированием

  #9  
Старый 17.11.2009, 23:51
Аватар для Mozy
Mozy
Познающий
Регистрация: 15.03.2009
Сообщений: 77
Провел на форуме:
984248

Репутация: 73
Отправить сообщение для Mozy с помощью ICQ
По умолчанию

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


Быстрый переход




ANTICHAT.XYZ