1 条题解
-
1
C
说明
本题要求判断n×n(n为偶数)矩阵是否为“对称矩阵”,对称矩阵需同时满足左右对称和上下对称两个条件,且需处理多组测试样例。具体逻辑如下:
- 左右对称:对矩阵的每一行i,该行第j个元素(0-based下标,即从0开始计数)需与第
n-1-j个元素相等(比如n=4时,第0列和第3列、第1列和第2列需相等)。 - 上下对称:对矩阵的每一列j,该列第i个元素需与第
n-1-i个元素相等(比如n=4时,第0行和第3行、第1行和第2行需相等)。 - 多组测试样例:需逐个处理每组数据,一旦某组数据不满足任一对称条件,立即输出NO;全部满足则输出YES。
时间复杂度方面,每组样例需两次双重循环(检查左右对称、检查上下对称),每次循环复杂度为O(n²)。因题目限制“所有n相加不超过5000”,即使n=1000,整体计算量也可控,不会超时。
代码
#include <stdio.h> // 矩阵最大尺寸:n最大1000,额外加10避免越界 #define N 1010 int g[N][N]; int main() { int t; scanf("%d", &t); while (t--) { int n; scanf("%d", &n); for (int i = 0; i < n; ++i) { for (int j = 0; j < n; ++j) { scanf("%d", &g[i][j]); } } // 标记是否为对称矩阵,初始设为1(是) int is_sym = 1; // 检查左右对称:遍历每行,比较j和n-1-j for (int i = 0; i < n && is_sym; ++i) { // j只需遍历到n-1-j(避免重复比较同一对元素) for (int j = 0; j < n-1-j; ++j) { if (g[i][j] != g[i][n-1-j]) { is_sym = 0; break; } } } // 若已不满足左右对称,无需检查上下对称 if (!is_sym) { printf("NO\n"); continue; } // 检查上下对称:遍历每列,比较i和n-1-i for (int j = 0; j < n && is_sym; ++j) { // i只需遍历到n-1-i(避免重复比较同一对元素) for (int i = 0; i < n-1-i; ++i) { if (g[i][j] != g[n-1-i][j]) { is_sym = 0; break; } } } // 根据结果输出 printf("%s\n", is_sym ? "YES" : "NO"); } return 0; }C语言拓展知识
推荐搜索:三元判断、条件判断中的短路逻辑(
&& is_sym的作用,提前终止循环)。C++
说明
本题逻辑与C语言完全一致(判断左右对称+上下对称,处理多组测试样例),但C++通过输入输出优化、模块化函数、常量定义等特性,让代码更简洁、高效,且结构更清晰。例如:用
FASTIO加速大数据输入输出,用solve函数封装单组样例处理逻辑,避免主函数冗长。新知识
-
输入输出优化(FASTIO):
- 术语:
ios::sync_with_stdio(0); cin.tie(0); cout.tie(0); - 解释:
ios::sync_with_stdio(0)关闭cin与C语言stdio的同步(默认同步为保证兼容性,会降低速度);cin.tie(0)解除cin与cout的绑定(默认cin会先刷新cout,增加耗时);cout.tie(0)同理。三者结合后,cin/cout速度接近scanf/printf,适合处理多组大数据。 - 对比:C语言依赖scanf/printf原生高效;C++需手动添加该优化,否则处理1e3组+1e3×1e3矩阵可能超时。
- 术语:
-
模块化函数(solve):
- 术语:将单组测试样例的“输入→检查→输出”逻辑封装为独立函数
solve() - 解释:主函数仅负责读取测试样例组数,具体逻辑交给
solve(),代码结构更清晰,便于调试和维护。 - 对比:C语言需在主函数内用循环嵌套处理逻辑,代码层级较深;C++模块化后,主函数更简洁。
- 术语:将单组测试样例的“输入→检查→输出”逻辑封装为独立函数
-
类型定义与常量:
- 术语:
#define int long long、const int N=1e3+10 - 解释:
#define int long long将默认int替换为64位整数(避免矩阵元素过大导致溢出);const int N=1e3+10定义矩阵最大尺寸(常量不可修改,避免越界,可读性比C的#define更好)。 - 对比:C语言需手动声明long long变量,且用#define定义尺寸(无类型检查);C++用const定义常量更安全,类型替换更便捷。
- 术语:
AC
#include<bits/stdc++.h> using namespace std; // 换行符定义,避免重复写"\n" #define endl '\n' // #define int long long // 输入输出优化:大幅提升cin/cout速度 #define FASTIO ios::sync_with_stdio(0);cin.tie(0);cout.tie(0); const int N=1e3+10; int g[N][N]; // 处理单组测试样例的函数 void solve() { int n; cin>>n; // 读取n×n矩阵(0-based下标) for (int i=0;i<n;++i) for (int j=0;j<n;++j) cin>>g[i][j]; // 检查左右对称:每行i的j与n-1-j比较,不满足则输出NO并退出函数 for (int i=0;i<n;++i) for (int j=0;j<n-1-j;++j) if (g[i][j]!=g[i][n-1-j]) {cout<<"NO"<<endl;return;} // 检查上下对称:每列j的i与n-1-i比较,不满足则输出NO并退出函数 for (int j=0;j<n;++j) for (int i=0;i<n-1-i;++i) if (g[i][j]!=g[n-1-i][j]) {cout<<"NO"<<endl;return;} // 全部满足,输出YES cout<<"YES"<<endl; } // signed main:因#define int long long,main需用signed修饰(部分编译器要求) signed main(){ FASTIO // 启用输入输出优化 int _=1; cin>>_; // 读取测试样例组数 while (_--) solve(); // 逐个处理每组样例 }C++拓展知识
推荐搜索:C++模块化函数的参数传递与返回值设计。
- 左右对称:对矩阵的每一行i,该行第j个元素(0-based下标,即从0开始计数)需与第
- 1
信息
- ID
- 490
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 5
- 标签
- (无)
- 递交数
- 27
- 已通过
- 9
- 上传者