Вращающийся массив по-разному - PullRequest
0 голосов
/ 23 октября 2010

эй, Мне нужно повернуть 2d массив таким образом: 4X4 ->

Input      Output
1 2 3 4   5 1 2 3 
5 6 7 8   1 2 6 4 
1 2 3 4   5 3 7 8
5 6 7 8   6 7 8 4

или для нечетного 5X5 ->

Input            Output
1 2 3 4  5   6 1 2 3  4
6 7 8 9 10   1 2 7 8  5 
1 2 3 4  5   6 7 3 9 10
6 7 8 9 10   1 8 9 4  5
1 2 3 4  5   2 3 4 5 10

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

PLZ Help

У меня нет идей и удачи.

Ответы [ 3 ]

2 голосов
/ 23 октября 2010

Вы можете разделить массив n x n следующим образом:

+-----------+
|\         /|
| \   1   / |
|  \     /  |
|   \   /   |
|    \ /    |
| 4   +   2 |
|    / \    |
|   /   \   |
|  /     \  |
| /   3   \ |
|/         \|
+-----------+

Затем все пиксели в области 1 сдвигаются вправо на один пиксель, все пиксели в области 2 сдвигаются вниз на один пиксель и т. Д.

Области могут быть определены математически.Предположим, что нижний левый угол равен (0,0), тогда разделительные линии 1 и 4 от 2 и 3 равны x = y, а разделительные линии 1 и 2 от 3 и 4 равны x = n - y.Тогда:

Пиксель находится в области 1, если x < y и x > n - y.(слева от x=y, справа от x=n-y)

Пиксель находится в области 2, если x > y и x > n - y.(справа от x=y, справа от x=n-y)

Аналогично для областей 3 и 4.

Вам необходимо правильно расположить краевые пиксели (для некоторых из этих сравнений требуется знак равенства), и ваш код будет зависеть от четности или четности размера массива.Но вы должны быть в состоянии пойти оттуда.

1 голос
/ 23 октября 2010
int [][] size = new int[sx][sx];
int [][] rot = new int[sx][sx];
int x=0;
for(int i=0;i<sx;i++)
{
    for(int j=0;j<sx;j++)
    {
        size[i][j]=x++;
    }
}

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

}

int n = sx-1;for (int i = 0; i <= n; i ++) {for (int j = 0; j <= n; j ++) {</p>

    if(i<j && i>=n-j)
        rot[i+1][j]=size[i][j];

    else if(i>=j && i > n-j)
        rot[i][j-1]=size[i][j];

    else if(i>j && i <= n-j)

        rot[i-1][j]=size[i][j];

    else if(i<=j && i < n-j)
        rot[i][j+1]=size[i][j];

    }

}
0 голосов
/ 23 октября 2010

Как насчет этого:

FIND OUTER EDGES (Hint: 0,0 to max_x,0; max_x,0 to max_x,max_y; max_x,max_y to 0,max_y; 0,max_y to 0,0)
Create a new array (call it buffer). (buffer[x][y])
buffer[1][0]=arr[0][0];
buffer[1][0]=arr[0][0];
buffer[1][0]=arr[0][0];
...
buffer[max_x][0]=arr[max_x - 1][0];

Сделайте следующий внутренний "внешний край", начните с 1,1 до max_x-1, max_y-1 и повторите.

...