java - Magic Square Method 需要输出是否是幻方以及行列之和

标签 java arrays

我正在做一项作业,该作业需要一个带有数字矩阵的数据文件并确定它是否是幻方。如果是,那么它还需要报告行和列的总和。输出:

矩阵是一个幻方。 所有行和列的总和是 34。

我不知道如何用一种方法来解决这个问题,我觉得它要求我返回 2 个值。我最接近的方法是在返回 true 时在方法末尾添加一个带有总和的 System.out.println。

但问题是我的输出是反词:

所有行和列的总和是 34。 该矩阵是一个幻方。

当我只被要求创建一种方法时,如何获得总和?下面是我的代码,老师给出了最后 3 个方法,所以我只关心前 2 个。

import java.io.File;
import java.io.FileNotFoundException;
import java.util.Scanner;
public class chp8magic
{
    public static void main(String args[])
    {
        int matrix[][] = initMatrix();
        printData(matrix); 

        if (isMagic(matrix)) {
            System.out.println("The matrix is a magic square.");
        }
        else {
            System.out.println("Not a magic square");
        }
    }

    public static boolean isMagic(int[][] mat)
    {
        int n = mat.length;
        int nSquare = n*n;
        int M = (n*n*(n*n+1)/2)/n;
        int sumRow = 0, sumColoumns = 0, sumPriDiag = 0, sumSecDiag = 0;
        boolean[] flag = new boolean[n*n];

        for(int row = 0; row < n; row++){

            sumRow = 0;
            sumColoumns = 0;

            for(int col = 0; col < n; col++)
            {
                if( mat[row][col] < 1 || mat[row][col] > nSquare )
                    return false;
                if(flag[mat[row][col]-1] == true) 
                    return false;

                flag[mat[row][col]-1] = true;
                sumRow += mat[row][col];
                sumColoumns += mat[col][row];
            }
            sumPriDiag += mat[row][row];
            sumSecDiag += mat[row][n-row-1];
            if(sumRow!=M || sumColoumns!=M)
                return false;
        }
        if(sumPriDiag!=M || sumSecDiag!=M) 
            return false;
        else
            return true;
    }

    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();
        }
    }
}

最佳答案

也许你只需要这样做:

System.out.println("is magic: " + isMagic);
System.out.ptintln("sum: " + sum);

然而,这并没有真正返回值,只是打印它们。要返回两个值,有多种选择。您可以返回一个对象:

public class MagicSquareProperties {

    private boolean magic;
    private int sum;

    public MagicSquareProperties(boolean magic, int sum) {
        this.magic = magic;
        this.sum = sum;
    }

    public boolean isMagic() {
        return magic;
    }

    public int getSum() {
        return sum;
    }
}

// now to return both values: return new MagicSquareProperties(true, 34);

但在我看来,最好的解决方案如下:

  1. 创建一个 MagicSquare 类。
  2. 添加属性声明(例如 private int sum)。
  3. 添加一个构造函数,例如 MagicSquare(File file),该构造函数读取文件并填充属性。
  4. 根据需要添加 getter 和 setter(例如 getSum())
  5. 执行另一个类中的main方法并调用new MagicSquare(...)来创建一个幻方对象。之后,您可以在需要该值时调用该对象的 getter。

关于java - Magic Square Method 需要输出是否是幻方以及行列之和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29616974/

相关文章:

java - 需要将值范围传递给准备好的语句

javascript - 通过字符串动态选择一个数组,然后 .map() 在它上面

c# - 如何在 C# 中解决 Randomize in place 算法?

java - Java 数组中的一堆元素

javascript - 如何映射嵌套对象数组?

python - 在 Hy 中使用 numpy.nditer

java - 如何动态导入javascript和css文件

java - 线程 “main” java.lang.StackOverflowError 中的异常

java - 导入 JavaFX 包以通过命令行/CMD 运行

java - Play框架2.0尝试级联删除时出错 "Parameter "#1"is not set; SQL statement: delete "