Magic Square终值始终为真

时间:2018-02-04 02:53:54

标签: java magic-square

上课时我们必须做一个魔术广场。我的代码有点工作,但是它有多个正方形,最后一个总是返回0,这就是魔术方块的工作方式。enter image description here

这是我检查的方式

  public int downDiagSum() {
int sum = 0;
for(int r = 0; r < grid.length; r++){
    for(int c = 0; c < grid.length; c++){
        sum += grid[r][c];
    }
}
return sum;



 public int upDiagSum() {
int sum = 0;
for(int r = grid.length - 1; r >= 0; r--){
    for(int c = 0; c < grid.length; c++){
        sum += grid[r][c];
    }
}
return sum;



 public int colSum(int col) {
int sum1 = 0;
for(int r = 0; r < grid[0].length; r++){
    sum1 += grid[r][col];
}
return sum1;

public int rowSum(int row) {
int sum2 = 0;
for(int r = 0; r < grid[0].length; r++){
    sum += grid[row][r];
  }
return sum2;


 public boolean isMagicSquare() {
int num = rowSum(0);
boolean isEqual = false;
if(downDiagSum() == upDiagSum()){
    //row check
    for(int r = 0; r < grid.length; r++){
        if(rowSum(r) == num){
            isEqual = true;
        }
      }
    //column check
    for(int r = 0; r < grid.length; r++){
        for(int c = grid.length - 1; c >= 0; c--){
            if(colSum(c) == num){
                isEqual = true;
            }
        }
    }
}
return isEqual;}

代码大部分都有效,但如果我有一个系列,它总是因某种原因返回true。下面设置的数字应该返回false但返回true

  

6 32 2 34 35 1
  7 11 27 28 8 30
  19 14 16 15 23 24
  18 20 22 21 17 13
  25 29 10 9 26 12
  36 5 33 4 3 31

抱歉格式不好我还是网站的新手。 谢谢, Garrows

2 个答案:

答案 0 :(得分:1)

在两个循环中,您正在检查每个行和每个列。并且你的逻辑说明当一个行或一个列总和等于第一行的总和时(这个包括第一行的总和)行!!!),你的变量isTrue变为真(永远)! 所以,你应该反向你的逻辑......

伪算法:

isTrue = true
int magicSum = sumOfFirstDiagonal
if (magicSum != sumOfSecondDiagonal) {isTrue = false; return}
for each row
    if (magicSum != sumOfRow) {isTrue = false; return}    
for each column
    if (magicSum != sumOfColumn) {isTrue = false; return} 

这是计算对角线总和的正确方法:

public static int diagSumTwo() {
    int sum = 0;
    for (int r = 0; r < grid.length; r++) {
        sum += grid[r][r];
    }
    return sum;
}

public static int diagSumOne() {
    int sum = 0;
    for (int r = grid.length - 1; r >= 0; r--) {
        sum += grid[r][grid.length - 1 - r];
    }
    return sum;
}

答案 1 :(得分:0)

问题在于isMagicSquare方法。

假设upDiagSum()返回与downDiagSum()相同的内容。然后,您的代码将进入if块并进入第一个for循环。但是在第一个for循环的第一次迭代中,您有r = 0,这意味着内部if语句等同于

if (rowSum(0) == rowSum(0))

这可能永远都是真的。

因此,isEqual在第一个循环的第一次迭代时设置为true,并且您永远不会将其设置为false。因此,无论后续迭代中发生什么,您的方法的返回值都将为true

您需要更改逻辑以使isEqual最初为真,但如果其中一个总和不匹配则变为false。