旋转阵列不同

时间:2010-10-23 05:09:27

标签: java matrix 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 个答案:

答案 0 :(得分:2)

您可以像这样划分n x n数组:

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

然后区域1中的所有像素向右移动一个像素,区域2中的所有像素向下移动一个像素等。

可以用数学方法定义区域。假设左下角是(0,0),那么2& 3的线分割区域1和4是x = y,而3& 4的线分割区域1& 2是x = n - y 。然后:

如果x < yx > n - y,则像素位于区域1中。 (x=y的左侧,x=n-y的右侧)

如果x > yx > n - y,则像素在区域2中。 (x=y右侧,x=n-y右侧)

同样适用于3区和3区。 4。

你需要使边缘像素正确(其中一些比较需要一个等号),你的代码将取决于数组大小的奇数或偶数。但是你应该可以从那里出发。

答案 1 :(得分:1)

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&lt; = n; i ++)     {         for(int j = 0; j&lt; = n; j ++)         {

    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];

    }

}

答案 2 :(得分:0)

这样怎么样:

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开始,然后重复。