当前位置: 首页 > news >正文

week4-[二维数组]幻方检测

week4-[二维数组]幻方检测

题目描述

幻方是一种很神奇的 NNNNNN 列的方阵:它由数字 1,2,3,…,N×N1,2,3,\ldots,N\times N1,2,3,,N×N 构成,其中1,2,3,…,N×N1,2,3,\ldots,N\times N1,2,3,,N×N中每个数字在幻方中出现恰好一次,并且每行、每列及两条对角线上的数字之和都相同。

给定一个 NNNNNN 列的整数方阵,其中第 iii 行 第 jjj 列的数字为 Ai,jA_{i,j}Ai,j。请判断该整数方阵是否为幻方。

输入格式

第一行包括一个整数 NNN,表示幻方的阶数。

接下来 NNN 行,每行 NNN 个整数,表示待检测的数字方阵 AAA

输出格式

如果输入的方阵 AAA 为幻方,则输出一行"Yes",否则输出一行"No"(输出的内容不包括引号)。

样例 #1

样例输入 #1

3
6 7 2
1 5 9
8 3 4

样例输出 #1

Yes

样例 #2

样例输入 #2

3
4 3 8
9 5 1
2 7 6

样例输出 #2

Yes

样例 #3

样例输入 #3

4
16 2 3 13
5 11 10 8
9 7 6 12
4 14 15 1

样例输出 #3

Yes

样例 #4

样例输入 #4

3
3 1 2
1 2 3
2 3 1

样例输出 #4

No

样例 #5

样例输入 #5

3
5 6 1
0 4 8
7 2 3

样例输出 #5

No

提示

数据范围

对于所有数据,3≤N≤30,0≤Ai,j≤10003 \le N \le 30,0 \le A_{i,j} \le 10003N30,0Ai,j1000

🔎 解题思路

一个矩阵要成为「幻方」,必须同时满足两个条件:

  1. 数字完整性:矩阵里的数字必须是 1 ~ N*N,每个出现且只出现一次。
    • 可以用一个布尔数组(或 set)来检查。
  2. 行列与对角线和相等
    • 先计算第一行的和作为目标值 target
    • 依次检查每一行、每一列是否和 target 相等。
    • 检查两条对角线是否和 target 相等。

只要有一条不满足,答案就是 "No"


📝 算法步骤

  1. 读入 N 和矩阵
  2. 检查数字范围与唯一性
    • 开一个大小 N*N+1 的布尔数组 used
    • 遍历矩阵元素,如果数字不在 1 ~ N*N 范围内或重复,直接输出 "No"
  3. 计算目标和 target = 第一行的和。
  4. 逐行逐列检查
    • 遍历所有行、列的和是否等于 target
  5. 检查两条对角线
    • 主对角线:A[1][1] + A[2][2] + ... + A[N][N]
    • 副对角线:A[1][N] + A[2][N-1] + ... + A[N][1]
  6. 如果所有条件都满足,输出 "Yes",否则输出 "No"

🧾 C++ 代码实现

#include <iostream>
#include <vector>
using namespace std;int main() {int N;cin >> N;vector<vector<int>> A(N, vector<int>(N));vector<bool> used(N * N + 1, false);// 读入并检查数字范围for (int i = 0; i < N; i++) {for (int j = 0; j < N; j++) {cin >> A[i][j];int val = A[i][j];if (val < 1 || val > N * N || used[val]) {cout << "No" << endl;return 0;}used[val] = true;}}// 目标和:第一行int target = 0;for (int j = 0; j < N; j++) target += A[0][j];// 检查每一行for (int i = 0; i < N; i++) {int sumRow = 0;for (int j = 0; j < N; j++) sumRow += A[i][j];if (sumRow != target) {cout << "No" << endl;return 0;}}// 检查每一列for (int j = 0; j < N; j++) {int sumCol = 0;for (int i = 0; i < N; i++) sumCol += A[i][j];if (sumCol != target) {cout << "No" << endl;return 0;}}// 主对角线int sumDiag1 = 0, sumDiag2 = 0;for (int i = 0; i < N; i++) {sumDiag1 += A[i][i];sumDiag2 += A[i][N - 1 - i];}if (sumDiag1 != target || sumDiag2 != target) {cout << "No" << endl;return 0;}cout << "Yes" << endl;return 0;
}
http://www.dtcms.com/a/349845.html

相关文章:

  • 【Android】Activity和Fragment之间的通讯
  • 大型电动化工程机械设备智能施工试验场的网络设计方案
  • java基础(十五)计算机网络
  • 【栈 - LeetCode】739.每日温度
  • 深入理解JVM垃圾收集器:垃圾收集器
  • Vue3 + Golang Gin 实现客服实时聊天系统(WebSocket + Socket.IO 详解)
  • Maven、Spring Boot、Spring Cloud以及它们的相互关系
  • iptables 防火墙技术详解
  • 如何通过虚函数实现多态?
  • 文入门Ubuntu:从零到精通的Linux之旅
  • 数学建模-整数规划(IP)
  • FunASR语音识别框架流式识别模型切换
  • SpringBoot的条件装配原理
  • SpringBoot3集成Oauth2.1——10重启程序Token失效(RSA持久化)
  • Java项目-苍穹外卖_Day1
  • Visual Studio 2022调试Eigen库查看矩阵与向量的值
  • 大模型知识点之矩阵乘以向量
  • springboot:前后端调用(axios发送异步请求)
  • 那我现在有3个输入 9层神经元 每层神经元数为 3 9 3 5 6 2 3 9 8 请给出我所有的权重矩阵
  • 图论水题5
  • ansible的搭建与安装
  • BIO、NIO 和 AIO
  • 智慧城市SaaS平台/交通设施运行监测系统之桥梁运行监测、城市道路塌陷风险运行监测系统架构内容
  • v-slot 与 slot-scope区别
  • 开源零信任本地化部署实战指南:Keycloak + OpenZiti 完整方案
  • [element-plus] el-table在行单击时获取行的index
  • JAVA高级工程师--云服务模式多租户SAAS项目商业模式架构全景
  • 【数据可视化-98】2025年上半年地方财政收入Top 20城市可视化分析:Python + Pyecharts打造炫酷暗黑主题大屏
  • 【Java基础】快速掌握Java泛型机制:基本概念与具体应用
  • 工具系列:JsonViewKit