如果Magic Square Method是魔术方格和行与列的总和,则需要输出

时间:2015-04-13 23:58:09

标签: java arrays

我正在进行一项分配,该分配采用带有数字矩阵的数据文件,并确定它是否是魔术方块。如果是,那么它还需要报告行和列的总和。随着输出:

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

我不确定如何用一种方法解决这个问题,我觉得它要求我返回2个值。我最接近的是在我的方法结束时添加一个System.out.println,并返回true。

但问题是我的输出是后缀:

所有行和列的总和为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();
        }
    }
}

1 个答案:

答案 0 :(得分:2)

可能你只需要这样做:

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(文件文件),此构造函数读取文件并填充属性。
  4. 根据需要添加getter和setter(例如getSum())
  5. 在另一个类中执行main方法并调用新的MagicSquare(...)来创建一个魔术方形对象。之后,只要您需要值,就可以在对象上调用getter。