题目描述
幻方(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矩阵,满足每行、列及对角线上的数字和相等。
问题描述
题目要求我们找到两个交错的数字,并将它们交换来修正已经损坏的幻方。
输入描述
- 输入的第一行包含一个整数 NNN,表示幻方的阶数(3≤N≤503 \leq N \leq 503≤N≤50)。
- 接下来输入 NNN 行,每行包含 NNN 个整数,表示幻方的初始状态。
输出描述
- 输出两行,分别是两条纠正信息,格式为“出错行号, 出错列号, 应填入的数字(未尾无空格)”。
- 输出行要按行号升序,如果行号相同则按列号升序。
例子
输入:
3
8 1 9
3 5 7
4 6 2
输出:
1 3 6
3 3 9
解题思路
- 计算期望的每行、每列及对角线的和:对于一个 N×NN \times NN×N 的幻方,其每行、每列及对角线的和应为 S=N×(N2+1)2S = \frac{N \times (N^2 + 1)}{2}S=2N×(N2+1)。
- 识别出错的行和列:遍历每行、每列,计算其和,如果和不等于 SSS,则该行或列可能有问题。
- 找到交错的数字:根据题目提示的两个可能出错的位置,进行验证,通过交换来修复幻方。
- 输出修复信息:按照要求输出修复后的信息。
下面是用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;
}
代码说明
- 输入读取:读取矩阵的维度 NNN 及 N×NN \times NN×N 的矩阵元素。
- 计算期望的和:计算幻方每行、每列及对角线的期望和。
- 找出错误的行和列:计算每行、每列的和,找出和不等于期望和的行和列。
- 计算正确的值:通过期望和、错误行的和及矩阵中的错误位置,计算出正确的值。
- 输出结果:按照题目要求的格式输出修复信息。
这个程序将帮助修复输入的幻方矩阵,并输出修复所需的信息。
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)