华为OD机试 - 幻方修复(Java)

【华为OD机试 2023】 幻方修复(C++ Java JavaScript Python) 幻方(Magic Square)是一个由1~N²,共N²个整数构成的N*N矩阵,满足每行、列和对角线上的数字和相等。每行输出空格隔开的三个整数,分别是:出错行号、出错列号、应填入的数字(末尾无空格)输出两行,代表两条纠正信息,注意先输出行号小的,若行号相同则先输出列好小的。接下来的N行,每行N个整数,空格隔开(1 ≤ 每个整数 ≤ N²)本文由博客一文多发平台。 阅读详情

题目描述

幻方(Magic Square)是一个由1~N²,共N²个整数构成的N*N矩阵,满足每行、列和对角线上的数字和相等。

上回你已经帮助小明将写错一个数字的幻方进行了修复,小明在感谢之余也想进一步试试你的水平,于是他准备了有两个数字发生了位置交换的幻方。

你可以把这两个交换的数字找出来并且改正吗?

输入描述

第一行输入一个整数N,代表带校验幻方的阶数(3 ≤ N < 50)

接下来的N行,每行N个整数,空格隔开(1 ≤ 每个整数 ≤ N²)

输出描述

输出两行,代表两条纠正信息,注意先输出行号小的,若行号相同则先输出列好小的

每行输出空格隔开的三个整数,分别是:出错行号、出错列号、应填入的数字(末尾无空格)

用例

输入3
8 1 9
3 5 7
4 6 2
输出1 3 6
3 2 9
说明无

Java

import java.util.ArrayList;
import java.util.Scanner;
 
public class Main {
  static int n; // 幻方的阶数
  static int[][] matrix; // 幻方
  static int magic_sum = 0; // 幻和
 
  public static void main(String[] args) {
    Scanner sc = new Scanner(System.in);
 
    n = sc.nextInt();
 
    matrix = new int[n][n];
    for (int i = 0; i < n; i++) {
      for (int j = 0; j < n; j++) {
        matrix[i][j] = sc.nextInt();
        magic_sum += matrix[i][j];
      }
    }
 
    magic_sum /= n;
 
    getResult();
  }
 
  public static void getResult() {
    // 记录 和不正确的行
    ArrayList<Integer> rows = new ArrayList<>();
    // 记录 和不正确的列
    ArrayList<Integer> cols = new ArrayList<>();
 
    for (int row = 0; row < n; row++) {
      if (getRowSum(row) != magic_sum) {
        rows.add(row); // 记录行号
      }
    }
 
    for (int col = 0; col < n; col++) {
      if (getColSum(col) != magic_sum) {
        cols.add(col); // 记录列号
      }
    }
 
    // 两点处于同一行,不同列
    if (rows.size() == 0) {
      // 则两点的行坐标可能是任意一行
      for (int i = 0; i < n; i++) rows.add(i);
    }
 
    // 两点处于同一列,不同行
    if (cols.size() == 0) {
      // 则两点的列坐标可能是任意一列
      for (int i = 0; i < n; i++) cols.add(i);
    }
 
    // 行号 x 列号,就可以组合出坐标
    ArrayList<int[]> positions = new ArrayList<>();
    for (Integer row : rows) {
      for (Integer col : cols) {
        positions.add(new int[] {row, col});
      }
    }
 
    // 组合两点,尝试交换
    for (int i = 0; i < positions.size(); i++) {
      for (int j = i + 1; j < positions.size(); j++) {
        if (isValid(positions.get(i), positions.get(j))) return;
      }
    }
  }
 
  // 尝试交换两个点,看是否可以复原幻方
  public static boolean isValid(int[] pos1, int[] pos2) {
    // 获取可能出错的两个点的坐标
    int x1 = pos1[0], y1 = pos1[1];
    int x2 = pos2[0], y2 = pos2[1];
 
    // 交换可能出错的两个点的值
    int tmp = matrix[x1][y1];
    matrix[x1][y1] = matrix[x2][y2];
    matrix[x2][y2] = tmp;
 
    boolean ans = magic_sum == getDiagonalSum1() && magic_sum == getDiagonalSum2();
 
    // 判断每一行的和是否相等
    if (ans)
      for (int r = 0; r < n; r++) {
        if (getRowSum(r) != magic_sum) {
          ans = false;
          break;
        }
      }
 
    // 判断每一列的和是否相等
    if (ans)
      for (int c = 0; c < n; c++) {
        if (getColSum(c) != magic_sum) {
          ans = false;
          break;
        }
      }
 
    // 如果所有行、列、对角线都相等,则返回对应交换位置
    if (ans) {
      if (x1 * n + y1 < x2 * n + y2) {
        System.out.println((x1 + 1) + " " + (y1 + 1) + " " + matrix[x1][y1]);
        System.out.println((x2 + 1) + " " + (y2 + 1) + " " + matrix[x2][y2]);
      } else {
        System.out.println((x2 + 1) + " " + (y2 + 1) + " " + matrix[x2][y2]);
        System.out.println((x1 + 1) + " " + (y1 + 1) + " " + matrix[x1][y1]);
      }
    } else {
      // 否则复原交换位置
      tmp = matrix[x1][y1];
      matrix[x1][y1] = matrix[x2][y2];
      matrix[x2][y2] = tmp;
    }
 
    return ans;
  }
 
  // 求对应行的和
  public static int getRowSum(int r) {
    int sum = 0;
    for (int c = 0; c < n; c++) sum += matrix[r][c];
    return sum;
  }
 
  // 求对应列的和
  public static int getColSum(int c) {
    int sum = 0;
    for (int r = 0; r < n; r++) sum += matrix[r][c];
    return sum;
  }
 
  // 求对角线的和(左上,到右下)
  public static int getDiagonalSum1() {
    int sum = 0;
    for (int i = 0; i < n; i++) {
      sum += matrix[i][i];
    }
    return sum;
  }
 
  // 求对角线的和(右上,到左下)
  public static int getDiagonalSum2() {
    int sum = 0;
    for (int i = 0; i < n; i++) {
      sum += matrix[i][n - 1 - i];
    }
    return sum;
  }
}

Java编程验证幻方 幻方这种娱乐性数学形式可以追溯到中国古代,它是数独和魔方的前身。所有这些都可以说是一种绝佳的“益智游戏”。 阅读详情

相关推荐

【华为OD机试真题】121、幻方修复 | 机试真题+思路参考+代码解析(C++、Java、Py、C语言、JS)

题目描述 >幻方(MagicQ Square) 是一个由1~N^2, >  >共N^2个整数构成的N*N矩阵,满足每行、列和对角线上的数字和相等。 >  上回你已经帮助小明将写错一个数字的幻方进行了修复,小明在感谢之余也想进一步试试你的水平, 于是他准备了有两个数字发生了位置交换的幻方。   你可以把这两个交换的数字找出来并且改正吗?

KJ.JK 1万+

幻方算法介绍(java示例)

幻方,有时又称魔方(该称呼现一般指立方体的魔术方块)或纵横图,由一组排放在正方形中的整数组成,其每行、每列以及两条对角线上的数之和均相等。通常幻方由从1到N2的连续整数组成,其中N为正方形的行或列的数目。因此N阶幻方有N行N列,并且所填充的数为从1到N2。 里面有java的程序示例

【华为OD机试真题】121、幻方修复 | 机试真题+思路参考+代码解析(C语言、C++、Java、Py、JS)

幻方(MagicQ Square) 是一个由1~N^2, >  >共N^2个整数构成的N*N矩阵,满足每行、列和对角线上的数字和相等。 >  上回你已经帮助小明将写错一个数字的幻方进行了修复,小明在感谢之余也想进一步试试你的水平, 于是他准备了有两个数字发生了位置交换的幻方。   你可以把这两个交换的数字找出来并且改正吗?

KJ.JK 1125

n阶幻方Java实现

NULL 博文链接:https://feng2010.iteye.com/blog/1175362

【华为OD机试真题 Java语言】121、幻方修复 | 机试真题+思路参考+代码解析

>幻方(MagicQ Square) 是一个由1~N^2, >  >共N^2个整数构成的N*N矩阵,满足每行、列和对角线上的数字和相等。 >  上回你已经帮助小明将写错一个数字的幻方进行了修复,小明在感谢之余也想进一步试试你的水平, 于是他准备了有两个数字发生了位置交换的幻方。   你可以把这两个交换的数字找出来并且改正吗?

KJ.JK 4138

【华为OD机试真题 2025B卷】121、幻方修复 | 机试真题+思路参考+代码解析(C++、Java、Py、C语言、JS)

【华为OD机试真题 2025B卷】121、幻方修复 | 机试真题+思路参考+代码解析(C++、Java、Py、C语言、JS) 华为od机试,华为od机试真题,华为od机试E卷,华为odE卷,华为od机试真题E卷,华为OD,华为OD机试,华为OD机试真题,华为od机考,华为od机试D卷,华为od机试真题D卷,华为od手撕代码,华为od,华为od机试C卷,华为od e卷,华为2025e卷,od机试,2025E卷,华为OD机试E卷,什么是华为od,华为od介绍,全面了解华为od,2025华为od,如何备战华为od

正在更新最新华为OD机试2025B卷,提供OJ在线刷题 3576

用Java验证幻方_关于“三阶幻方”算法的Java实现

/*算法分析:* 名称:三阶幻方* 题目:试将1~9这9个不同的整数填入一个3x3的表格,使每行,每列,以及每条对角线上的数字之和相同。* 解析思路:* 要满足题目中的条件,那么,数字之和必为15,数字5必定是中间的那个数。* 1.将剩下的数分为几组(1,9),(2,8),(3,7),(4,6)* 在表格中,这些数字与中间的数字连线会有对应关系通过这些对应关系来得到我们想要的结果。* 2.将表格编...

weixin_42520132的博客 889

华为OD机试 - 幻方修复问题详解及四种编程语言的实现(C++/Java/JavaScript/Python)

在这篇文章中,我们详细分析了华为OD机试中的幻方修复问题,解释了如何找出并修复幻方中交换了位置的两个数字。我们提供了C++、Java、JavaScript、Python四种编程语言的完整实现,并对每种语言的代码做了详细的注释和解释。幻方问题不仅涉及矩阵操作,还考验了对数学公式的理解以及如何高效地找出问题所在。通过本文的学习,读者可以掌握幻方修复问题的解法,并将这种方法应用到类似的算法题中。

m0_57781768的博客 314

【 华为OD机试 2023】 九宫格游戏 / 三阶积幻方(C++ Java JavaScript Python)

JVM调优数据类型Java虚拟机中,数据类型可以分为两类:基本类型和引用类型。基本类型的变量保存原始值,即:他代表的值就是数值本身;而引用类型的变量保存引用值。“引用值”代表了某个对象的引用,而不是对象本身,对象本身存放在这个引用值所表示的地址的位置。基本类型包括:byte,short,int,long,char,float,double,Boolean,returnAddress引用类型包括:类类型,接口类型和数组。堆与栈堆和栈是程序运行的关键,很有必要把他们的关系说清楚。Java对象的大小基本数据的类型

m0_57042151的博客 371

【华为OD机试】真题A卷-幻方修复(JAVA)

【华为OD机试】真题A卷-幻方修复(JAVA):幻方(Magic Square) 是一个由1~N^2,共N^2个整数构成的N*N矩阵,满足每行、列和对角线上的数字和相等.上回你已经帮助小明将写错一个数字的幻方进行了修复,小明在感谢之余也想进一步试试你的水平,于是他准备了有两个数字发生了位置交换的幻方。

u014481728的博客 508

华为OD机试 - 幻方修复(Java 2025 B卷 200分)

上回你已经帮助小明将写错一个数字的幻方进行了修复,小明在感激之余也想进一步试试你的水平,于是他准备了有两个数字发生了位置交换的幻方。幻方(Magic Square)是一个由 1~N²,共 N² 个整数构成的 N*N 矩阵,满足每行、列和对角线上的数字和相等。每行输出空格隔开的三个整数,分别是:出错行号、出错列号、应填入的数字(末尾无空格)接下来的 N 行,每行 N 个整数,空格隔开(1 ≤ 每个整数 ≤ N²)输出两行,代表两条纠正信息,注意先输出行号小的,若行号相同则先输出列好小的。

学Java,找哪吒 837

java写三阶方阵_java编程:编写一个程序验证输入的3阶矩阵是否为幻方

set = new HashSet();for (int[] i : array) {for (Integer j : i) {set.add(j);}}if (set.size() != 9) {return false;// 有重复} else {return true;// 不重复}}public static void main(String[] args) {int[][] number...

weixin_39609770的博客 1296

华为OD机试 - 幻方修复(C++ Java JavaScript Python )

由于需要找到两个数字,因此需要使用双重循环,遍历整个矩阵,找到符合条件的两个数字。具体来说,对于两行的情况,需要遍历第一行中的每一个数字,同时在第二行中查找一个数字,使得将第一个数字和第二个数字交换位置后,第一行和第二行的数字之和都等于。由于幻方的特殊性质,每一行、每一列和对角线上的数字和相等,因此可以计算出每行、每列、每条对角线上数字之和的目标值。对于两列的情况,需要遍历第一列中的每一个数字,同时在第二列中查找一个数字,使得将第一个数字和第二个数字交换位置后,第一列和第二列的数字之和都等于。

算法大师! 1154

n阶幻方java代码

n阶幻方的求法(java代码版)。由于现在网上还没有系统的求n阶幻方的java代码,所以写出来供大家参考!

华为OD机试2023(JS,C++,JAVA,PYTHON)-幻方修复

幻方 (Magic Square) 是一个由1~N^2,共N^2个整数构成的N*N矩阵,满足每行、列和对角线上的数字和相等.上回你已经帮助小明将写错一个数字的幻方进行了修复,小明在感谢之余也想进一步试试你的水平,于是他准备了 有两个数字发生了位置交换 的幻方。 你可以把这两个交换的数字找出来并且改正吗? 输入描述 第一行输入一个整数N,代表带校验幻方的阶数 (3

qznjj6的博客 89

【华为OD机试真题】121、幻方修复 | 机试真题+思路参考+代码解析(C++、Java、Py、JS)

### 🎃题目描述 >幻方(MagicQ Square) 是一个由1~N^2, >  >共N^2个整数构成的N*N矩阵,满足每行、列和对角线上的数字和相等。 >  上回你已经帮助小明将写错一个数字的幻方进行了修复,小明在感谢之余也想进一步试试你的水平, 于是他准备了有两个数字发生了位置交换的幻方。   你可以把这两个交换的数字找出来并且改正吗?

正在更新最新华为OD机试2025B卷,提供OJ在线刷题 1216

用JAVA写的幻方

很不错的幻方哦~~~可以输入任意的奇数,输出幻方

AGM Supra软件从零到一:国产CPLD工程创建全流程拆解

本文详细拆解了AGM Supra软件从零开始创建国产CPLD工程的全流程,包括开发环境配置、工程创建、Quartus项目转换、TCL脚本执行与编译等关键步骤。特别强调了中文路径避坑、器件型号选择等实用技巧,帮助开发者高效完成CPLD开发任务。

weixin_29158413的博客 410
上一篇: 华为OD机试 - 猜数字(Java)
下一篇: 华为OD机试 - 寻找符合要求的最长子串(Java)
清水乐园
博客等级 码龄13年 175粉丝 398原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

清水乐园

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值