再旋转一个阵列2次?

时间:2015-06-23 08:46:32

标签: java

我已经能够通过反转它来旋转坐标数组,但是我需要另外两个可能的旋转,我不知道该怎么做。这是我当前的代码,我打印坐标作为例子。

/**
 *  Visual representation of coords.
 *
 *   xxxxx
 *   xxxxx
 *   xx+xx
 *   xxxxx
 *   xxxxx
 * 
 *  + is [0,0]
 */

public static void main(String[] args) {
    List < String > array = getCoordinates(0, 0, 2);

    int i = 0;

    System.out.println("Rotation 1: ");

    for (String line: array) {
        if (i == 4) {
            System.out.println(line);
            i = -1;
        } else {
            System.out.print(line + " ");
        }
        i++;
    }

    System.out.println(" ");
    System.out.println("Rotation 2: ");

    Collections.reverse(array);
    i = 0;

    for (String line: array) {
        if (i == 4) {
            System.out.println(line);
            i = -1;
        } else {
            System.out.print(line + " ");
        }
        i++;
    }

}

这是getCoordinates方法。

public static List < String > getCoordinates(int x, int z, int range) {

    List < String > ids = new ArrayList < String > ();

    for (int i = -range; i <= range; i++) {
        for (int j = -range; j <= range; j++) {
            int nx = x + i;
            int nz = z + j;
            ids.add("[" + nx + "," + nz + "]");
        }
    }

    return ids;
}

对不起大量的代码,但这是我能够最好地说明我尝试过的唯一方法。

修改 这是输出。

Rotation 1: 
[-2,-2] [-2,-1] [-2,0] [-2,1] [-2,2]
[-1,-2] [-1,-1] [-1,0] [-1,1] [-1,2]
[0,-2] [0,-1] [0,0] [0,1] [0,2]
[1,-2] [1,-1] [1,0] [1,1] [1,2]
[2,-2] [2,-1] [2,0] [2,1] [2,2]

Rotation 2: 
[2,2] [2,1] [2,0] [2,-1] [2,-2]
[1,2] [1,1] [1,0] [1,-1] [1,-2]
[0,2] [0,1] [0,0] [0,-1] [0,-2]
[-1,2] [-1,1] [-1,0] [-1,-1] [-1,-2]
[-2,2] [-2,1] [-2,0] [-2,-1] [-2,-2]

这里有两个可能的旋转,因为它是一个正方形。这些是我想要的。

  

这是我在网上找到的相关图片,显示了3个旋转   方格。

enter image description here

2 个答案:

答案 0 :(得分:1)

这是旋转的逻辑。尝试自己编写代码......

向右旋转原始90度:

/**
 *  original
 *   wqxxx
 *   asxxx
 *   xx+xx
 *   xxxxx
 *   xxxxx
 * 
 *  rotated
 *   xxxaw
 *   xxxsq
 *   xx+xx
 *   xxxxx
 *   xxxxx
 */

// w: -2,-2 -> -2,2
// q: -2,-1 -> -1,2
// a: -1,-2 -> -2,1
// s: -1,-1 -> -1,1

旋转右逻辑:旋转行=原始列,旋转列=原始行* -1

向左旋转原始90度:

/**
 *  original
 *   wqxxx
 *   asxxx
 *   xx+xx
 *   xxxxx
 *   xxxxx
 * 
 *  rotated
 *   xxxxx
 *   xxxxx
 *   xx+xx
 *   qsxxx
 *   waxxx
 */

// w: -2,-2 -> 2,-2
// q: -2,-1 -> 1,-2
// a: -1,-2 -> 2,-1
// s: -1,-1 -> 1,-1

旋转左逻辑:旋转行=原始列* -1,旋转列=原始行

答案 1 :(得分:0)

如果有人因任何原因碰巧碰到这个问题,这里是我用来旋转数组的代码。

public static void main(String[] args) {
    List<String> array = getCoordinates(0,0,2);
    List<String> rotated = new ArrayList<String>();

    prnt(array); // original

    for(int b = 0;b < 5;b++){
        int index = 20+b;
        for(int a = 0;a < 5;a++){
            rotated.add(array.get(index));
            index -= 5;
        }
    }

    prnt(rotated); // 2nd rotation

    Collections.reverse(array);

    prnt(array); // 3rd rotation

    Collections.reverse(rotated);

    prnt(rotated); // 4th rotation
}

private static void prnt(List<String> rotated) {
    int i = 0;
    for(String line : rotated){
        if(i == 4){
            System.out.println(line);
            i = -1;
        }else{
            System.out.print(line + " ");
        } 
        i++;
    }
}

输出是。

# x x x x
x x x x x
x x x x x
x x x x x
x x x x x

x x x x #
x x x x x
x x x x x
x x x x x
x x x x x

x x x x x
x x x x x
x x x x x
x x x x x
x x x x #

x x x x x
x x x x x
x x x x x
x x x x x
# x x x x