用于检查数组是否为Latin Square的Java方法

时间:2017-06-22 21:06:15

标签: java arrays multidimensional-array

我正在使用一个方法创建一个程序,该方法的输入是一个int的二维数组,它检查数组是否为Latin Squares

例如,拉丁广场看起来像这样:

1 2 3
2 3 1
3 1 2

到目前为止,这是我的代码:

public class LatinSquare {

  public boolean isLatinSquare(int[][] a){

    int[] row= new  int[a.length];
    int[] column = new int[a[0].length];

    for (int j = 0; j<column.length; j++){
      for (int i = 0; i<row.length;i++){
        row[i] = a[i][j];
      }

      for (int i = 0; i<row.length -1; i++){
        for (int x= i+1; x<=row.length;x++){
          if (row[i]==row[x]) 
            return false;
        }
      }
   }
}

代码并不完全完整,但我只是想知道,如果我做错了什么,在我走向错误的方向之前是否有人可以回答一些问题。 我的问题:这是检查数组以查看它们是否符合拉丁方的最佳方法吗?我的思维过程是我从列'0'开始然后遍历将每个数字相互比较的行,确保它们不相等,并以这种方式遍历每一列。这是接近这个的错误方法吗?

1 个答案:

答案 0 :(得分:0)

许多嵌套循环会降低性能。这是一个更快的版本,但它使用了更多的内存。

它依赖于main()1范围内的平方值,其中N是平方大小。

N

测试

private static boolean isLatinSquare(int[][] square) {
    boolean[][] foundInRow = new boolean[square.length][square.length];
    boolean[][] foundInCol = new boolean[square.length][square.length];
    for (int row = 0; row < square.length; row++) {
        if (square[row].length != square.length)
            return false; // Not a square
        for (int col = 0; col < square.length; col++) {
            int idx = square[row][col] - 1;
            if (foundInRow[row][idx] || foundInCol[col][idx])
                return false;
            foundInRow[row][idx] = foundInCol[col][idx] = true;
        }
    }
    return true;
}

输出

System.out.println(isLatinSquare(new int[][] { {1, 2, 3},
                                               {2, 3, 1},
                                               {3, 1, 2} }));
System.out.println(isLatinSquare(new int[][] { {1, 2, 3},
                                               {3, 1, 2},
                                               {2, 3, 1} }));
System.out.println(isLatinSquare(new int[][] { {1, 3, 2},
                                               {2, 1, 3},
                                               {3, 2, 1} }));
System.out.println(isLatinSquare(new int[][] { {1, 3, 2},
                                               {3, 2, 1},
                                               {2, 1, 3} }));
System.out.println(isLatinSquare(new int[][] { {1, 3, 2},
                                               {3, 2, 1},
                                               {1, 3, 2} }));
System.out.println(isLatinSquare(new int[][] { {1, 3, 1},
                                               {3, 2, 3},
                                               {2, 1, 2} }));
System.out.println(isLatinSquare(new int[][] { {1, 2, 3},
                                               {2, 3},
                                               {3, 1, 2} }));