在Java中,我必须检查给定的矩阵是否是拉丁方
我的老师给了我们一个矩阵,我们应该写一个代码来检查它是否是拉丁方。我有所有的零件,但我有麻烦把他们的顺序,使他们的工作。 这是她给我们的,让我们阅读她创建的矩阵 文本文件是matrix.txt,下面是它包含的内容 三, 1 2 3 3 1 2 2 3 1 正如你所看到的,这是一个拉丁方,然而,她说我们可以改变矩阵,以确保它能处理她给我们的其他问题在Java中,我必须检查给定的矩阵是否是拉丁方,java,matrix,latin-square,Java,Matrix,Latin Square,我的老师给了我们一个矩阵,我们应该写一个代码来检查它是否是拉丁方。我有所有的零件,但我有麻烦把他们的顺序,使他们的工作。 这是她给我们的,让我们阅读她创建的矩阵 文本文件是matrix.txt,下面是它包含的内容 三, 1 2 3 3 1 2 2 3 1 正如你所看到的,这是一个拉丁方,然而,她说我们可以改变矩阵,以确保它能处理她给我们的其他问题 import java.io.File; import java.io.FileNotFoundException; i
import java.io.File;
import java.io.FileNotFoundException;
import java.util.Scanner;
public class Multidim {
public static void main(String args[]){
int matrix[][] = initMatrix();
//printData(matrix); //Uncomment to print array
/////YOUR MAIN CODE HERE/////
}
///PLACE YOUR METHODS HERE
public static int[][] initMatrix(){
int matrix[][];
Scanner filein = null;
try {
filein = new Scanner(new File("matrix.txt"));
int numRows = Integer.parseInt(filein.nextLine());
matrix = new int[numRows][];
parseData(matrix, filein);
filein.close();
return matrix;
} catch (FileNotFoundException e) {
System.out.println(e.getMessage());
if(filein != null)
filein.close();
return null;
}
}
public static void parseData(int matrix[][], Scanner in){
for(int r = 0; r < matrix.length; r++){
String splitLine[] = in.nextLine().split(" ");
matrix[r] = new int[splitLine.length];
for(int c = 0; c < matrix[r].length; c++){
matrix[r][c] = Integer.parseInt(splitLine[c]);
}
}
}
public static void printData(int matrix[][]){
for(int r = 0; r < matrix.length; r++){
for(int c = 0; c < matrix[r].length; c++){
System.out.print(matrix[r][c] + " ");
}
System.out.println();
}
}
我会这样做的 Multidim.java
import java.io.File;
import java.io.FileNotFoundException;
import java.util.Scanner;
public class Multidim
{
public static void main(String args[])
{
int matrix[][] = initMatrix();
// printData(matrix); //Uncomment to print array
if(latinSquare(matrix))
{
System.out.println("This is a Latin Square");
}
else
{
System.out.println("This is not a Latin Square");
}
}
public static boolean latinSquare(int[][] array)
{
for (int i = 0; i<array.length ;i++)
{
// check for duplicates in each row
if(duplicates(array[i]))
{
return false;
}
// create a column array
int[] column = new int[array[i].length];
for(int j = 0; j<array.length; j++)
{
column[j] = array[j][i]; // could throw an exception if the input file isn't square 3x3, 2x2, 4x4, etc
}
// check for duplicates in each column
if(duplicates(column))
{
return false;
}
}
return true;
}
public static boolean duplicates(int[] array)
{
for (int i = 0; i<array.length; i++)
{
for(int j = 0; j<array.length; j++)
{
if (i != j && array[i] == array[j])
{
return true;
}
}
}
return false;
}
///PLACE YOUR METHODS HERE
public static int[][] initMatrix()
{
int matrix[][];
Scanner filein = null;
try
{
filein = new Scanner(new File("matrix.txt"));
int numRows = Integer.parseInt(filein.nextLine());
matrix = new int[numRows][];
parseData(matrix, filein);
filein.close();
return matrix;
}
catch (FileNotFoundException e)
{
System.out.println(e.getMessage());
if(filein != null)
{
filein.close();
}
return null;
}
}
public static void parseData(int matrix[][], Scanner in)
{
for(int r = 0; r < matrix.length; r++)
{
String splitLine[] = in.nextLine().split(" ");
matrix[r] = new int[splitLine.length];
for(int c = 0; c < matrix[r].length; c++)
{
matrix[r][c] = Integer.parseInt(splitLine[c]);
}
}
}
public static void printData(int matrix[][])
{
for(int r = 0; r < matrix.length; r++)
{
for(int c = 0; c < matrix[r].length; c++)
{
System.out.print(matrix[r][c] + " ");
}
System.out.println();
}
}
}
请注意,您的方法应该遵循
方法应该是动词,混合大小写,第一个字母小写,每个内部单词的第一个字母大写
这就是为什么我将
LatinSquare
更改为LatinSquare
您需要提供“matrix.txt”文件或输入文件格式我如何提供matrix.txt文件?如果您想创建自己的matrix.txt文件,它只是一个3x3矩阵,是一个拉丁方。请将其添加到问题中,并使用适当的换行符。我将其添加到问题中,但不确定是否正确。请让我知道。如果投票箭头下的绿色复选框满足您的问题,请接受我的回答。谢谢您的帮助。然而,当我用另一个矩阵来测试它并确保它是正确的时,它不起作用。不管我用什么矩阵,它都说它是拉丁方,即使它不是。这是因为在所有布尔运算完成之前,第一个部分有system.out.println吗?你能给我一些不适合你的测试用例吗?我已经用非拉丁方测试过了。将第一行从1 2 3
更改为1 2 1
会导致这不是拉丁方
。此外,Java是异步的,除非生成新线程。布尔值总是先返回的。我可能打错了,我会看看。我使用的矩阵是3x3{123}{321}{231}。我会再试一次,我作弊并做了复制粘贴,以确保我没有键入错误,它工作正常。谢谢。现在,我希望能够让程序识别问题在非拉丁方中的位置。例如,如果它位于第2列第2行中。这可能吗?@LisaS我会克制自己不去做你的全部家庭作业。这不是你原来的问题。我会给你一个线索,是的,这是可能的,看看使用的索引变量(I
,j
)。它们正在计算正在检查的阵列的当前位置。
if(LatinSquare(matrix)==false)
System.out.println("This is not a Latin Square");
else
System.out.println("This is a Latin Square");
import java.io.File;
import java.io.FileNotFoundException;
import java.util.Scanner;
public class Multidim
{
public static void main(String args[])
{
int matrix[][] = initMatrix();
// printData(matrix); //Uncomment to print array
if(latinSquare(matrix))
{
System.out.println("This is a Latin Square");
}
else
{
System.out.println("This is not a Latin Square");
}
}
public static boolean latinSquare(int[][] array)
{
for (int i = 0; i<array.length ;i++)
{
// check for duplicates in each row
if(duplicates(array[i]))
{
return false;
}
// create a column array
int[] column = new int[array[i].length];
for(int j = 0; j<array.length; j++)
{
column[j] = array[j][i]; // could throw an exception if the input file isn't square 3x3, 2x2, 4x4, etc
}
// check for duplicates in each column
if(duplicates(column))
{
return false;
}
}
return true;
}
public static boolean duplicates(int[] array)
{
for (int i = 0; i<array.length; i++)
{
for(int j = 0; j<array.length; j++)
{
if (i != j && array[i] == array[j])
{
return true;
}
}
}
return false;
}
///PLACE YOUR METHODS HERE
public static int[][] initMatrix()
{
int matrix[][];
Scanner filein = null;
try
{
filein = new Scanner(new File("matrix.txt"));
int numRows = Integer.parseInt(filein.nextLine());
matrix = new int[numRows][];
parseData(matrix, filein);
filein.close();
return matrix;
}
catch (FileNotFoundException e)
{
System.out.println(e.getMessage());
if(filein != null)
{
filein.close();
}
return null;
}
}
public static void parseData(int matrix[][], Scanner in)
{
for(int r = 0; r < matrix.length; r++)
{
String splitLine[] = in.nextLine().split(" ");
matrix[r] = new int[splitLine.length];
for(int c = 0; c < matrix[r].length; c++)
{
matrix[r][c] = Integer.parseInt(splitLine[c]);
}
}
}
public static void printData(int matrix[][])
{
for(int r = 0; r < matrix.length; r++)
{
for(int c = 0; c < matrix[r].length; c++)
{
System.out.print(matrix[r][c] + " ");
}
System.out.println();
}
}
}
3
1 2 3
3 1 2
2 3 1