Рубрики

Матрица преобразования на месте в определенном порядке

Напишите код для преобразования матрицы определенным образом без использования дополнительного пространства.

 
Input:
      1 2 3
      4 5 6
      7 8 9

Output:
      1 6 7
      2 5 8
      3 4 9

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


Мы настоятельно рекомендуем вам свернуть браузер и попробовать это в первую очередь.

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

Ниже C ++ реализация идеи.

// Программа для преобразования матрицы в определенном порядке
// использование транспонированной матрицы на месте
#include <bits/stdc++.h>
#define HASH_SIZE 128

using namespace std;

  
// Неквадратная матричная транспонирование матрицы размера rxc
// и базовый адрес A

void transformMatrix(int *A, int r, int c)

{

    // Инвертировать четные строки

    for (int i = 1; i < r; i = i + 2)

        for (int j1 = 0, j2 = c - 1; j1 < j2; j1++, j2--)

            swap(*(A + i*c + j1), *(A + i*c + j2));

  

    // Остальная часть кода ниже поста

    // http://tinyurl.com/j79j445

    int size = r*c - 1;

    int t; // содержит элемент для замены, в конце концов

           // становится следующим элементом для перемещения

    int next; // расположение 't' для перемещения

    int cycleBegin; // держит начало цикла

  

    bitset<HASH_SIZE> b; // хеш для пометки перемещенных элементов

  

    b.reset();

    b[0] = b[size] = 1;

    int i = 1; // Обратите внимание, что A [0] и A [size-1] не будут двигаться

    while (i < size)

    {

        cycleBegin = i;

        t = A[i];

        do

        {

            // Матрица ввода [rxc]

            // Выходная матрица 1

            // i_new = (i * r)% (N-1)

            next = (i*r)%size;

            swap(A[next], t);

            b[i] = 1;

            i = next;

  

        while (i != cycleBegin);

  

        // Get Next Move (как насчет запросов

        // случайное местоположение?)

        for (i = 1; i < size && b[i]; i++)

            ;

    }

}

  
// Утилита для печати двумерного массива размера
// nr x nc и базовый адрес A

void Print2DArray(int *A, int nr, int nc)

{

    for (int r = 0; r < nr; r++)

    {

        for (int c = 0; c < nc; c++)

            printf("%4d", *(A + r*nc + c));

  

        printf("\n");

    }

  

    printf("\n");

}

  
// Программа драйвера для проверки вышеуказанной функции

int main(void)

{

    int A[][4] = {{1, 2, 3, 4},

                 {5, 6, 7, 8},

                 {9, 10, 11, 12}};

  

    int r = 3, c = 4;

  

    cout << "Given Matrix:\n";

    Print2DArray((int *)A, r, c);

  

    transformMatrix((int *)A, r, c);

  

    cout << "Transformed Matrix:\n";

    Print2DArray((int *)A, c, r);

  

    return 0;

}

Выход:

Given Matrix:
   1   2   3   4
   5   6   7   8
   9  10  11  12

Transformed Matrix:
   1   8   9
   2   7  10
   3   6  11
   4   5  12

Эта статья предоставлена Aditya Goel . Если вам нравится GeeksforGeeks и вы хотите внести свой вклад, вы также можете написать статью и отправить ее по почте на contrib@geeksforgeeks.org. Смотрите свою статью, появляющуюся на главной странице GeeksforGeeks, и помогите другим вундеркиндам.

Пожалуйста, напишите комментарии, если вы обнаружите что-то неправильное, или вы хотите поделиться дополнительной информацией по обсуждаемой теме

Рекомендуемые посты:

Матрица преобразования на месте в определенном порядке

0.00 (0%) 0 votes