簡體   English   中英

用Java旋轉指定的4x4列數組

[英]Rotating a specified column 4x4 array in Java

基本上,我有一個4x4數組,其中初始化了整數0-15。 這個小任務是旋轉數組的給定列,例如,如果數組為:

  14   0   1  12
  13   4   2   3
   7   6  11   8
   5  15   9  10

應用rotateColumn(3)之后,數組應如下所示:

      14   0   1  10
      13   4   2  12
       7   6  11   3
       5  15   9   8

我設法實現了行旋轉方法,代碼是:

public static void rotateRow(int[][] arr, int row) {
        int newCurrent = arr[row][arr.length - 1];
        int nextCurrent;
        for (int currentIndex = 0; currentIndex < arr.length; currentIndex++) { 
            nextCurrent = arr[row][currentIndex];
            arr[row][currentIndex] = newCurrent;
            newCurrent = nextCurrent;
        }
    }

我為column方法嘗試了類似的代碼,但沒有成功:

public static void rotateColumn(int[][] arr, int column) {
    int newCurrent1 = arr[column][arr.length - 1];
    int nextCurrent1 ;
    for (int currentIndex1 = 0; currentIndex1 < arr.length; currentIndex1++){
        nextCurrent1 = arr[column][currentIndex1];
        arr[column][currentIndex1] = newCurrent1;
        newCurrent1 = nextCurrent1;
    }

    }

該程序的整個代碼為:

public class Puzzle {

    public static final int N = 4;
    public static final int NUMBER_OF_ROTATIONS = 5;

    public static void main(String[] args) {
        int[][] puzzle = new int[N][N];
        reset(puzzle);
        test(puzzle);
        reset(puzzle);
        scramble(puzzle);
        System.out.println("### Testing puzzle game play\n");
        play(puzzle);
    }

    public static void print(int[][] puzzle) {
        for (int[] row : puzzle) {
            for (int elem : row) {
                System.out.printf("%4d", elem);
            }
            System.out.println();
        }
        System.out.println();
    }

    public static void test(int[][] puzzle) {
        System.out.println("### Testing reset method\n");
        print(puzzle);
        System.out.println("### Testing rotate methods\n");
        print(puzzle);
        for (int i = 0; i < N; i++) {
            System.out.println("### rotateColumn(" + i + ")\n");
            rotateColumn(puzzle, i);
            print(puzzle);
            System.out.println("### rotateRow(" + i + ")\n");
            rotateRow(puzzle, i);
            print(puzzle);
        }
        reset(puzzle); 
        System.out.println("### Testing random rotations\n");
        print(puzzle); 
        for (int i = 0; i < 5; i++){
            randomRotation(puzzle);
            print(puzzle); 
        }
    }

    public static void reset(int[][] puzzle) {
        for (int i = 0; i < N; i++) {
            for (int j = 0; j < N; j++)
                puzzle[i][j] = i * N + j;
        }
    }

    public static void scramble(int[][] puzzle) {
        for (int i = 0; i < NUMBER_OF_ROTATIONS; i++) {
            randomRotation(puzzle);
        }
    }




    public static void rotateRow(int[][] arr, int row) {
        int newCurrent = arr[row][arr.length - 1];
        int nextCurrent;
        for (int currentIndex = 0; currentIndex < arr.length; currentIndex++) { 
            nextCurrent = arr[row][currentIndex];
            arr[row][currentIndex] = newCurrent;
            newCurrent = nextCurrent;
        }
    }





    // TODO: Implement method as specified in assignment brief 

    public static void rotateColumn(int[][] arr, int column) {
    int newCurrent1 = arr[column][arr.length - 1];
    int nextCurrent1 ;
    for (int currentIndex1 = 0; currentIndex1 < arr.length; currentIndex1++){
        nextCurrent1 = arr[column][currentIndex1];
        arr[column][currentIndex1] = newCurrent1;
        newCurrent1 = nextCurrent1;
    }

    }


    // TODO: Implement method as specified in assignment brief 

    public static void randomRotation(int[][] puzzle) {
    }

    // TODO: Implement method as specified in assignment brief 

    static void play(int[][] puzzle) {
    }

}

有人可以指出我需要做些正確的事以確保其正常工作嗎? 非常感謝您:)。

看來您在混淆行和列的內存布局。 數據數組始終是行數組。 因此,您需要更改如何處理單個元素。 您需要對原始方法進行細微調整。 以下來自rotateRow()的未經測試的代碼應該有所作為。

    public static void rotateColumn(int[][] arr, int col) {
        int newCurrent = arr[arr.length - 1][col];
        int nextCurrent;
        for (int currentIndex = 0; currentIndex < arr.length; currentIndex++) { 
            nextCurrent = arr[currentIndex][col];
            arr[currentIndex][col] = newCurrent;
            newCurrent = nextCurrent;
        }
    }

這個怎么樣?

public void rotateColumn(int[][] arr, int column) {
    int[] col = new int[arr.length];
    for(int row=0; row<arr.length; row++) {
        col[row] = arr[row][column];
    }
    for(int row=0; row<arr.length; row++) {
        arr[row][column] = col[(row==0) ? arr.length-1 : row-1];
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM