Форум программистов, компьютерный форум CyberForum.ru

Циклический сдвиг матрицы - C++

Восстановить пароль Регистрация
 
Dreeni
48 / 0 / 1
Регистрация: 02.06.2013
Сообщений: 133
Записей в блоге: 2
21.06.2013, 07:05     Циклический сдвиг матрицы #1
Есть динамическая матрица, и есть обычный сдвиг на N элементов на право.
как сделать сдвиг по рисунку?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
#include <stdlib.h>
#include <iostream>
#include <stdio.h>
using namespace std;
void shiftRight( int **matrix, int rows, int columns, int shift);
 
 
int main()
{
   int rows,columns,shift,i,j;
   int **matrix;
   cout<<"Введите количечтво строк ";
   cin>>rows;
   cout<<"Введите количество столбцов ";
   cin>>columns;
   //случайное заполнение
   //и вывод двумерного массива
   matrix = ( int ** ) malloc( rows * sizeof (int *) );
   for(i=0;i<rows;++i)
   {
      matrix[i] = (int *)malloc( columns * sizeof (int) );
      for(j = 0; j < columns; ++j)
      {
         matrix[i][j]= -50 + rand()%100;
         cout<<matrix[i][j]<<"\t";
      }
      cout<<"\n";
   }
 
   cout<<"На сколько элементов произвести циклический сдвиг?: ";
   cin>>shift;
   shiftRight( matrix, rows, columns, shift );
   cout<<"\n";
 
   for( i = 0; i < rows; ++i )
   {
      for( j = 0; j < columns; ++j )
         cout<<matrix[i][j]<<"\t";
      cout<<"\n";
   }
 
   for( i = rows - 1; i >= 0; --i )
      free( matrix[i] );
   free( matrix );
 
   return 0;
}
 
 
void shiftRight( int **matrix, int rows, int columns, int shift )
{
   int i;
   int MATRIX_SIZE = rows * columns;
   shift = shift % MATRIX_SIZE;
 
   if ( shift == 0 )
      return;
 
   int *temp_matrix = (int *) malloc( MATRIX_SIZE * sizeof (int) );
 
   for ( int i = 0; i < MATRIX_SIZE; ++i )
   {
      temp_matrix[i] = matrix[ i / columns ][ i % columns ];
   }
 
   for (i = 0; i < MATRIX_SIZE; ++i )
   {
      matrix[i / columns] [i % columns] = temp_matrix[(i + MATRIX_SIZE - shift) % MATRIX_SIZE];
   }
 
   free( temp_matrix );
}
Миниатюры
Циклический сдвиг матрицы  
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
21.06.2013, 09:39     Циклический сдвиг матрицы #2
@Dreeni, Ваш код не работает или в чем проблема?
Dreeni
48 / 0 / 1
Регистрация: 02.06.2013
Сообщений: 133
Записей в блоге: 2
21.06.2013, 09:49  [ТС]     Циклический сдвиг матрицы #3
Странно, у меня всё работает
Миниатюры
Циклический сдвиг матрицы  
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
21.06.2013, 09:51     Циклический сдвиг матрицы #4
Цитата Сообщение от Dreeni Посмотреть сообщение
Странно, у меня всё работает
Странно, что Вы тему создали не проверив
Dreeni
48 / 0 / 1
Регистрация: 02.06.2013
Сообщений: 133
Записей в блоге: 2
21.06.2013, 09:54  [ТС]     Циклический сдвиг матрицы #5
Цитата Сообщение от Tulosba Посмотреть сообщение
Странно, что Вы тему создали не проверив
извиняюсь, не так понял. проблема в том что я не знаю как сделать циклический сдвиг как показано на рисунке, и прошу помощи.
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
21.06.2013, 09:56     Циклический сдвиг матрицы #6
@Dreeni, то ли я не вижу разницы, то ли всё работает и так.
Dreeni
48 / 0 / 1
Регистрация: 02.06.2013
Сообщений: 133
Записей в блоге: 2
21.06.2013, 10:04  [ТС]     Циклический сдвиг матрицы #7
Цитата Сообщение от Tulosba Посмотреть сообщение
@Dreeni, то ли я не вижу разницы, то ли всё работает и так.
Должно идти как бы змейкой. А сейчас идёт подобно нажатию Enter.
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
21.06.2013, 10:11     Циклический сдвиг матрицы #8
Цитата Сообщение от Dreeni Посмотреть сообщение
А сейчас идёт подобно нажатию Enter.
Это как? По-моему, обе Ваши картинки идентичны с точки зрения перемещения элементов.
Dreeni
48 / 0 / 1
Регистрация: 02.06.2013
Сообщений: 133
Записей в блоге: 2
21.06.2013, 10:50  [ТС]     Циклический сдвиг матрицы #9
ох. Посмотрите, вот я нарисовал, как сейчас программа выполняет сдвиг. и сравните с изначальным рисунком
Миниатюры
Циклический сдвиг матрицы  
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.06.2013, 15:07     Циклический сдвиг матрицы
Еще ссылки по теме:

Как осуществить циклический сдвиг элементов квадратной матрицы C++
C++ Циклический сдвиг матрицы MxN
Выполнить циклический сдвиг элементов квадратной матрицы, используя локальные и динамические массивы C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
21.06.2013, 15:07     Циклический сдвиг матрицы #10
@Dreeni, понял. Протупил

Добавлено через 4 часа 12 минут
Немного подумав, родил такой вариант:
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
#include <iostream>
#include <cstdlib>
#include <vector>
#include <algorithm>
#include <numeric>
#include <iomanip>
 
void PrintAsMatrix( const std::vector<int>& v, int cols )
{
    int i=0;
    for( const auto& e : v )
    {
        std::cout << std::setw(3) << e << " ";
        if( ++i % cols == 0)
        {
            std::cout << std::endl;
        }
    }
    std::cout << "-------\n";
}
 
void ZTransform( std::vector<int>& v, int rows, int cols )
{
    // Каждую строку с нечетным индексом обратить
    for( int i=1; i<rows; i += 2 )
    {
        std::reverse( v.begin() + i*cols, v.begin() + (i+1)*cols );
    }
}
 
void ZShift(std::vector<int>& v, int rows, int cols, int shift)
{
    ZTransform( v, rows, cols );
    // Циклический сдвиг
    std::rotate( v.begin(), v.begin() + v.size() - shift, v.end() );
    ZTransform( v, rows, cols );
}
 
int main()
{
    const int rows = 3;
    const int cols = 5;
 
    std::vector<int> v( cols*rows );
    std::iota( v.begin(), v.end(), 1 );
 
    PrintAsMatrix( v, cols );
 
    ZShift( v, rows, cols, 1 );
    
    PrintAsMatrix( v, cols );
 
    system("pause");
    return 0;
}
Yandex
Объявления
21.06.2013, 15:07     Циклический сдвиг матрицы
Ответ Создать тему
Опции темы

Текущее время: 05:15. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru