Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Suares
0 / 0 / 0
Регистрация: 28.02.2013
Сообщений: 106
1

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

29.01.2014, 23:14. Просмотров 436. Ответов 3
Метки нет (Все метки)

Ребята вот есть, например, матрица:
123
456
надо что бы получилось
412
563
при таком примере шаг равняется 1.
Мой вариант с квадратными матрицами справляется, а вот уже с MxN, я не могу додумать
Буду благодарен, если увидите мою ошибку.

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
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
#include <iostream>
#include <time.h>
#include <map>
#include <vector>
#include <algorithm>
 
const int ROW = 10;
const int COLUMN = 10;
 
void initMatrix(std::vector< std::vector<int> >& m);
void showMatrix(std::vector< std::vector<int> >& m);
void shiftMatrix(int, std::vector< std::vector<int> >& m);
 
int main()
{
    srand(static_cast<unsigned int>(time(0)));
 
    std::vector< std::vector<int> > matrix(ROW);
 
    initMatrix(matrix);
    showMatrix(matrix);
 
    printf("\nHow many steps to turn? ");
    int step;
    scanf("%d", &step);
    printf("\n");
 
    shiftMatrix(step, matrix);
 
    showMatrix(matrix);
 
    return 0;
}
 
void initMatrix(std::vector< std::vector<int> >& m)
{
    for (int i = 0; i < ROW; i++)
        for (int j = 0; j < COLUMN; j++)
            m[i].push_back(rand() % 10 + 1);
}
 
void showMatrix(std::vector< std::vector<int> >& m)
{
    std::for_each(m.begin(), m.end(), [](std::vector<int>& vec)
    {
        std::for_each(vec.begin(), vec.end(), [](int i)
        {
            printf("%i\t", i);
        });
        printf("\n");
    });
}
 
void shiftMatrix(int step, std::vector< std::vector<int> >& m)
{
    int tmpArr[2*(ROW + COLUMN)-4], shiftArr[2*(ROW + COLUMN)-4];
    int hEdge, vEdge, i, j, c;
 
    for(int k = 0; k < ROW/2; k++)
    {
        hEdge = ROW - 1 - k;
        vEdge = COLUMN - 1 - k;
        c = 0;
 
        for(j = k; j < hEdge; j++)
        {
            tmpArr[c] = m[k][j];
            c++;
        }
        for(i = k; i < vEdge; i++)
        {
            tmpArr[c] = m[i][hEdge];
            c++;
        }
        for(j = hEdge; j >= k; j--)
        {
            tmpArr[c] = m[vEdge][j];
            c++;
        }
        for(i = vEdge - 1; i > k; i--)
        {
            tmpArr[c] = m[i][k];
            c++;
        }
 
        for(i = 0; i < 4*(ROW-2*k-1); i++)
            shiftArr[(i+step)%(4*(ROW-2*k-1))] = tmpArr[i];
 
        c = 0;
        for(j = k; j < hEdge; j++)
        {
            m[k][j] = shiftArr[c];
            c++;
        }
        for(i = k; i < vEdge; i++)
        {
            m[i][hEdge] = shiftArr[c];
            c++;
        }
        for(j = hEdge; j >= k; j--)
        {
            m[vEdge][j] = shiftArr[c];
            c++;
        }
        for(i = vEdge - 1; i > k; i--)
        {
            m[i][k] = shiftArr[c];
            c++;
        }
    }
}
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.01.2014, 23:14
Ответы с готовыми решениями:

Циклический сдвиг матрицы
Всем доброго дня. Программа располагает двумерный массив в динамичной памяти и...

Циклический сдвиг матрицы
Есть динамическая матрица, и есть обычный сдвиг на N элементов на право. как...

Циклический сдвиг элементов прямоугольной матрицы
Мне нужно сделать такую программу: Осуществить циклический сдвиг элементов...

Осуществить циклический сдвиг матрицы по условию
Необходимо осуществить циклический сдвиг элементов прямоугольной матрицы на n...

Осуществить циклический сдвиг элементов квадратной матрицы
(Console Application) Осуществить циклический сдвиг элементов квадратной...

3
GuGo1991
270 / 264 / 146
Регистрация: 02.08.2012
Сообщений: 609
30.01.2014, 00:18 2
Suares, таким образом нужно сместить только граничные элементы или всю матрицу?
1
Suares
0 / 0 / 0
Регистрация: 28.02.2013
Сообщений: 106
30.01.2014, 00:49  [ТС] 3
Цитата Сообщение от GuGo1991 Посмотреть сообщение
граничные элементы или всю матрицу?
Всю матрицу, вот больше пример:
1 2 3 4
5 6 7 8
9 10 11 12
13 14 15 16
при циклическом сдвиге получится:
5 1 2 3
9 10 6 4
13 11 7 8
14 15 16 12
Но вот только это для квадратной. А у меня задача с матрицей MxN.
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
void shiftMatrix(int step, std::vector< std::vector<int> >& m)
{
    int tmpArr[2*(ROW + COLUMN)-4], shiftArr[2*(ROW + COLUMN)-4];
    int hEdge, vEdge, i, j, c;
 
    //обход матрицы по внешнему кругу с дальнейшим смещением в центр
    for(int k = 0; k < ROW/2; k++)
    {
        hEdge = ROW - 1 - k; //граница по строке
        vEdge = COLUMN - 1 - k; // граница по столбцу
        c = 0;
 
        for(j = k; j < hEdge; j++) // проход слева на право на верхней строке
        {
            tmpArr[c] = m[k][j];
            c++;
        }
        for(i = k; i < vEdge; i++) // проход сверху в низ в правом столбце
        {
            tmpArr[c] = m[i][hEdge];
            c++;
        }
        for(j = hEdge; j >= k; j--) // справа на лево в нижней строке
        {
            tmpArr[c] = m[vEdge][j];
            c++;
        }
        for(i = vEdge - 1; i > k; i--) // снизу в верх в левом столбце
        {
            tmpArr[c] = m[i][k];
            c++;
        }
 
        for(i = 0; i < 4*(ROW-2*k-1); i++) // вот тут возможно у меня и ошибка! Я смещаю элементы массива на заданный шаг. Но с матрицей MxN я не могу подобрать формулу 4*(ROW-2*k-1) - это для квадратной я так понял.
            shiftArr[(i+step)%(4*(ROW-2*k-1))] = tmpArr[i];
 
        c = 0;
        //Переписываем элементы со смещением.
        for(j = k; j < hEdge; j++)
        {
            m[k][j] = shiftArr[c];
            c++;
        }
        for(i = k; i < vEdge; i++)
        {
            m[i][hEdge] = shiftArr[c];
            c++;
        }
        for(j = hEdge; j >= k; j--)
        {
            m[vEdge][j] = shiftArr[c];
            c++;
        }
        for(i = vEdge - 1; i > k; i--)
        {
            m[i][k] = shiftArr[c];
            c++;
        }
    }
}
0
GuGo1991
270 / 264 / 146
Регистрация: 02.08.2012
Сообщений: 609
30.01.2014, 20:19 4
Suares, может есть недочёты, отпишитесь если что не ясно.
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
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
#include <iostream>
#include <iomanip>
using namespace std;
 
int main()
{
    int W, H;
    cout << "Enter M: "; cin >> W;
    cout << "Enter N: "; cin >> H;
    cout << "\n\n";
    int** M = new int*[W];
    for(int i = 0; i < W; i++)
        M[i] = new int[H];
        
    int q = 0, loop = 0, counter;
    for(int i = 0; i < W; i++)
    {
        for(int j = 0; j < H; j++)
        {
            q++;
            M[i][j] = q;
        }
    }
    
    for(int i = 0; i < W; i++)
    {
        for(int j = 0; j < H; j++)
        {
            cout << setw(3) << M[i][j];
        }
        cout << "\n\n";
    }
    
    if(!(W % 2))
        counter = W / 2 - 1;
    else
        counter = W / 2;
    
    while(loop <= counter)
    {
        int temp1 = 0, temp2 = 0;       
        for(int j = loop, i = j; j < H - loop; j++) //Смещаем верхнюю границу
        {
            if(temp1 > 0)
            {
                temp1 = M[i][j];
                M[i][j] = temp2;
            }
            else
                temp1 = M[i][j];
            temp2 = temp1;
        }
        for(int j = loop + 1; j < W - loop; j++) //Смещаем правую границу
        {
            temp1 = M[j][H - 1 - loop];
            M[j][H - 1 - loop] = temp2;
            temp2 = temp1;
        }
        for(int j = H - loop - 2; j >= loop; j--) //Смещаем нижнюю границу
        {
            temp1 = M[W - 1 - loop][j];
            M[W - 1 - loop][j] = temp2;
            temp2 = temp1;
        }
        for(int j = W - loop - 2; j >= loop; j--) //Смещаем левую границу
        {
            temp1 = M[j][loop];
            M[j][loop] = temp2;
            temp2 = temp1;
        }
        loop++;
    }
    
    cout << "\n\n";
    
    for(int i = 0; i < W; i++)
    {
        for(int j = 0; j < H; j++)
        {
            cout << setw(3) << M[i][j];
        }
        cout << "\n\n";
    }
    
    delete []M[H];
    
    system("pause");
    return 0;
}
1
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.01.2014, 20:19

Осуществить циклический сдвиг элементов прямоугольной матрицы
Здравствуйте, было задание Осуществить циклический сдвиг элементов...

Циклический сдвиг прямоугольной матрицы на n элементов вправо
Подскажите пожалуйста в чем ошибка. Надо осуществить циклический сдвиг...

Циклический сдвиг элементов матрицы по кругу на число T
Доброго времени суток. Искал, искал так и не нашел что-нибудь по сдвигу...


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru