我正在使用一个方法创建一个程序,该方法的输入是一个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'开始然后遍历将每个数字相互比较的行,确保它们不相等,并以这种方式遍历每一列。这是接近这个的错误方法吗?
答案 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} }));