Другие языки программирования и технологии

Как поменять местами столбцы в матрице. C++

Есть ключ (например - 2,4,3,1,0) и матрица 4х4 заполненная буквами английского алфавита! Как поменять местами столбцы по заданному ключу? То есть, чтобы первым столбцом стал второй, вторым - четвертый и так далее! Прошу обычный пример, желательно с указателями! Заранее спасибо!
#include <algorithm>
#include <iostream>

using namespace std;

int main() {
    char a[5][5] =
        {{ 'a', 'b', 'c', 'd', 'e' },
         { 'a', 'b', 'c', 'd', 'e' },
         { 'a', 'b', 'c', 'd', 'e' },
         { 'a', 'b', 'c', 'd', 'e' },
         { 'a', 'b', 'c', 'd', 'e' }};
    int k[5] = { 2, 4, 3, 1, 0 };

    for (char *r = *a; r < *a + 5 * 5; r += 5) {
        for (char *c = r; c < r + 5; ++c) cout << *c << ' ';
        cout << endl;
    }

    for (char *r = *a; r < *a + 5 * 5; r += 5) {
        char t[5], *pt = t;
        for (int *pk = k; pk < k + 5; ++pk) *pt++ = *(r + *pk);
        copy(t, t + 5, r);
    }

    cout << endl;
    for (char *r = *a; r < *a + 5 * 5; r += 5) {
        for (char *c = r; c < r + 5; ++c) cout << *c << ' ';
        cout << endl;
    }

    return 0;
}
Сергей Барабанов
Сергей Барабанов
97 007
Лучший ответ
/*
Для массива не в динамической памяти переписывать значения надо.
Если же массив создан через new именно постолбцам, то менять указатели на столбец.
*/

char k[5] = {2,4,3,1,0}; // ключ из 5 чисел
char **m = new char*[5]; // указатели на 5 столбцов
for(int i=0; i<5; i++) m = new char[5]; // данные по столбцам

// заполним символами столбцы
int ks = 'a';
for(int i=0; i<5; i++)
for(int j=0; j<5; j++)
{
m[ i ][ j ] = ks;
ks++;
}

// покажем столбцы
for(int i=0; i<5; i++)
{
for(int j=0; j<5; j++) cout << m[ j ][ i ] << " ";
cout << endl;
}

// обмен столбцов согласно ключу
char *u[5]; // 5 указателей в порядке столбцов по ключу
for(int i=0; i<5; i++) u[ i ] = m[k[ i ]];
for(int i=0; i<5; i++) m[ i ] = u[ i ]; // новый порядок
cout << endl;

// покажем столбцы
for(int i=0; i<5; i++)
{
for(int j=0; j<5; j++) cout << m[ j ][ i ] << " ";
cout << endl;
}

// удаляем память
for(int i=0; i<5; i++) delete[] m[ i ];
delete[] m;
АК
Антон Котляр
74 744