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

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

Восстановить пароль Регистрация
 
Suares
0 / 0 / 0
Регистрация: 28.02.2013
Сообщений: 106
29.01.2014, 23:14     Циклический сдвиг матрицы MxN #1
Ребята вот есть, например, матрица:
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++;
        }
    }
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
GuGo1991
267 / 261 / 93
Регистрация: 02.08.2012
Сообщений: 609
30.01.2014, 00:18     Циклический сдвиг матрицы MxN #2
Suares, таким образом нужно сместить только граничные элементы или всю матрицу?
Suares
0 / 0 / 0
Регистрация: 28.02.2013
Сообщений: 106
30.01.2014, 00:49  [ТС]     Циклический сдвиг матрицы MxN #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++;
        }
    }
}
GuGo1991
267 / 261 / 93
Регистрация: 02.08.2012
Сообщений: 609
30.01.2014, 20:19     Циклический сдвиг матрицы MxN #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;
}
Yandex
Объявления
30.01.2014, 20:19     Циклический сдвиг матрицы MxN
Ответ Создать тему
Опции темы

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