2024华为OD试题及答案-A016-幻方修复

题目描述

幻方(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
说明

题目解析

幻方(Magic Square)的定义

幻方是一个由1到N2N^2N2共N2N^2N2个整数构成的N×NN \times NN×N矩阵,满足每行、列及对角线上的数字和相等。

问题描述

题目要求我们找到两个交错的数字,并将它们交换来修正已经损坏的幻方。

输入描述

  1. 输入的第一行包含一个整数 NNN,表示幻方的阶数(3≤N≤503 \leq N \leq 503≤N≤50)。
  2. 接下来输入 NNN 行,每行包含 NNN 个整数,表示幻方的初始状态。

输出描述

  1. 输出两行,分别是两条纠正信息,格式为“出错行号, 出错列号, 应填入的数字(未尾无空格)”。
  2. 输出行要按行号升序,如果行号相同则按列号升序。

例子

输入:

3
8 1 9
3 5 7
4 6 2

输出:

1 3 6
3 3 9

解题思路

  1. 计算期望的每行、每列及对角线的和:对于一个 N×NN \times NN×N 的幻方,其每行、每列及对角线的和应为 S=N×(N2+1)2S = \frac{N \times (N^2 + 1)}{2}S=2N×(N2+1)​。
  2. 识别出错的行和列:遍历每行、每列,计算其和,如果和不等于 SSS,则该行或列可能有问题。
  3. 找到交错的数字:根据题目提示的两个可能出错的位置,进行验证,通过交换来修复幻方。
  4. 输出修复信息:按照要求输出修复后的信息。

下面是用C++实现的代码。

#include <iostream>
#include <vector>
using namespace std;

int main() {
    int N;
    cin >> N;
    vector<vector<int>> matrix(N, vector<int>(N));
    
    // 输入幻方矩阵
    for (int i = 0; i < N; ++i) {
        for (int j = 0; j < N; ++j) {
            cin >> matrix[i][j];
        }
    }

    // 计算期望的和
    int target_sum = N * (N * N + 1) / 2;

    // 找出每行每列的实际和
    vector<int> row_sum(N, 0), col_sum(N, 0);
    for (int i = 0; i < N; ++i) {
        for (int j = 0; j < N; ++j) {
            row_sum[i] += matrix[i][j];
            col_sum[j] += matrix[i][j];
        }
    }

    // 找出有问题的行和列
    int wrong_row = -1, wrong_col = -1;
    for (int i = 0; i < N; ++i) {
        if (row_sum[i] != target_sum) wrong_row = i;
        if (col_sum[i] != target_sum) wrong_col = i;
    }

    // 计算正确的数值
    int correct_value = target_sum - row_sum[wrong_row] + matrix[wrong_row][wrong_col];

    // 输出结果
    cout << wrong_row + 1 << " " << wrong_col + 1 << " " << correct_value << endl;
    cout << wrong_row + 1 << " " << wrong_col + 1 << " " << matrix[wrong_row][wrong_col] << endl;

    return 0;
}

代码说明

  1. 输入读取:读取矩阵的维度 NNN 及 N×NN \times NN×N 的矩阵元素。
  2. 计算期望的和:计算幻方每行、每列及对角线的期望和。
  3. 找出错误的行和列:计算每行、每列的和,找出和不等于期望和的行和列。
  4. 计算正确的值:通过期望和、错误行的和及矩阵中的错误位置,计算出正确的值。
  5. 输出结果:按照题目要求的格式输出修复信息。

这个程序将帮助修复输入的幻方矩阵,并输出修复所需的信息。

Python实现:

def magic_square_fix(N, matrix):
    # 计算期望的和
    target_sum = N * (N * N + 1) // 2

    # 找出每行每列的实际和
    row_sum = [0] * N
    col_sum = [0] * N
    for i in range(N):
        for j in range(N):
            row_sum[i] += matrix[i][j]
            col_sum[j] += matrix[i][j]

    # 找出有问题的行和列
    wrong_row = -1
    wrong_col = -1
    for i in range(N):
        if row_sum[i] != target_sum:
            wrong_row = i
        if col_sum[i] != target_sum:
            wrong_col = i

    # 计算正确的数值
    correct_value = target_sum - row_sum[wrong_row] + matrix[wrong_row][wrong_col]

    # 输出结果
    result = []
    result.append(f"{wrong_row + 1} {wrong_col + 1} {correct_value}")
    result.append(f"{wrong_row + 1} {wrong_col + 1} {matrix[wrong_row][wrong_col]}")
    return result

# 读取输入
N = int(input())
matrix = []
for _ in range(N):
    matrix.append(list(map(int, input().split())))

# 获取修复信息
fix_info = magic_square_fix(N, matrix)

# 输出结果
for line in fix_info:
    print(line)

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值