为何Java程序无法正确识别幻方?求代码修正方案
4阶幻方判定代码修复方案
常见误判原因及修复步骤
1. 哨兵值读取逻辑错误
如果读取文件时未正确过滤哨兵值-999,或未在遇到哨兵时终止读取,会导致方阵混入无效值,直接破坏和的计算。
修复代码:
List<Integer> validNums = new ArrayList<>(); Scanner fileScanner = new Scanner(new File("your_file_path.txt")); while (fileScanner.hasNextInt()) { int currentNum = fileScanner.nextInt(); if (currentNum == -999) { break; // 触发哨兵,停止读取 } validNums.add(currentNum); } fileScanner.close(); // 校验数据量是否符合4阶幻方要求 if (validNums.size() != 16) { System.out.println("无效数据:需16个有效数字"); return; } // 转换为4x4方阵 int[][] square = new int[4][4]; int idx = 0; for (int i = 0; i < 4; i++) { for (int j = 0; j < 4; j++) { square[i][j] = validNums.get(idx++); } }
2. 基准和计算错误
若错误选取基准和(比如用错误行/列,或计算时包含无效值),会导致后续所有校验失效。
修复代码:
// 以第一行的和作为幻方基准和 int targetSum = 0; for (int num : square[0]) { targetSum += num; }
3. 行、列、对角线校验逻辑错误
常见问题包括遍历索引错误(比如副对角线索引计算失误)、累加时跳过元素等。
修复后的完整校验逻辑:
// 校验所有行 boolean isMagic = true; for (int i = 0; i < 4; i++) { int rowSum = 0; for (int j = 0; j < 4; j++) { rowSum += square[i][j]; } if (rowSum != targetSum) { isMagic = false; break; } } // 校验所有列 if (isMagic) { for (int j = 0; j < 4; j++) { int colSum = 0; for (int i = 0; i < 4; i++) { colSum += square[i][j]; } if (colSum != targetSum) { isMagic = false; break; } } } // 校验主对角线 if (isMagic) { int diag1Sum = 0; for (int i = 0; i < 4; i++) { diag1Sum += square[i][i]; } if (diag1Sum != targetSum) { isMagic = false; } } // 校验副对角线 if (isMagic) { int diag2Sum = 0; for (int i = 0; i < 4; i++) { // 副对角线索引为 [i, 3-i](数组索引从0开始) diag2Sum += square[i][3 - i]; } if (diag2Sum != targetSum) { isMagic = false; } } // 输出结果 if (isMagic) { System.out.println("这是一个有效的4阶幻方"); } else { System.out.println("不是幻方"); }
关键注意点
- 必须确保方阵中无
-999哨兵值,所有参与计算的都是有效数字; - 副对角线的索引计算需注意数组从0开始,正确索引为
3-i而非4-i; - 校验顺序可任意,但一旦发现不符合项应立即终止校验,提升效率。
内容的提问来源于stack exchange,提问作者annie
相关产品推荐
相关产品推荐

