Повернуть матрицу одномерного массива - PullRequest
1 голос
/ 27 ноября 2010

Мне нужен алгоритм для (по часовой стрелке) вращения матрицы, представленной одномерным массивом.
До сих пор я нашел следующие ссылки, но не смог ничего найти, чтобы приблизить меня к решению, которое янужно:
http://basgun.wordpress.com/2008/04/11/rotate-array/
http://www.rawkam.com/?p=1008

Любые предложения или подсказки будут с благодарностью!

Христо

Редактировать: Вот пример
(1 2 3 (один цикл вращения по часовой стрелке) (7 4 1
4 5 6 ---------> 8 5 2
7 8 9) 9 6 3)

(7 4 1 (цикл вращения пыльника по часовой стрелке) (9 8 7
8 5 2 ---------> 6 5 4
9 6 3) 3 2 1)

Ответы [ 3 ]

0 голосов
/ 16 августа 2016

Исходя из этого ответа, я изменил решение с 2D-массива на 1D-массив.Это написано на C #, но должно работать для любого языка C-esque.

public static int[] Rotate1DSquareMatrixClockwise(int[] matrix)
{
    int size = (int)Math.Sqrt(matrix.Length);
    int[] result = new int[matrix.Length];

    for (int i = 0; i < size; ++i)
    {
        for (int j = 0; j < size; ++j)
        {
            result[i * size + j] = matrix[(size - j - 1) * size + i];
        }
    }

    return result;
}

Этот ответ работает только для квадратных матриц .Примечание. Чтобы получить доступ к элементам из квадратного двумерного массива в виде одномерного массива, достаточно просто: for matrix NxN: m1[i,j] = m2[i * N + j] Итак, это все, что я изменил в связанном решении.

0 голосов
/ 07 марта 2017

Это просто

шагов, чтобы повернуть по часовой стрелке

1. Взять транспонированную матрицу

2. Поменять столбцы

/*a is the given matrix , b is the output matrix ,n is the size of the matrix*/
System.out.println("Transpose of given matrix\n");
        for(i=0;i<n;i++)
        {
            for(j=0;j<n;j++)
            {
              b[i][j]=a[j][i];
            }
        }

        for(i=0;i<n;i++)
        {
            for(j=0;j<n;j++)
            {
                System.out.print(b[i][j]+"\t");
            }
            System.out.println("\n");
        }

        System.out.println("Clockwise Rotation of given matrix\n");

        for(i=0;i<n/2;i++)
        {
            for(j=0;j<n;j++)
            {

                sw=b[j][i];
                b[j][i]=b[j][n-1-i];
                b[j][n-1-i]=sw;
            }
            System.out.println("\n");
        }


        //Print the Result 
        for(i=0;i<n;i++)
        {
            for(j=0;j<n;j++)
            {
                System.out.print(b[i][j]+"\t");
            }
            System.out.println("\n");
        }

Проверено и сработало

0 голосов
/ 27 ноября 2010

В Википедии есть отличная статья о «вращении матрицы по часовой стрелке» ( Транспонирование матрицы на месте -> Алгоритмы )

Вы не сказали, какой язык используете, но для этогоВ этом случае C-подобные языки имеют отличный способ доступа к «матрице, представленной одномерным массивом».

...