1 条题解

  • 1
    @ 2025-9-13 15:49:32

    C

    说明

    本题要求判断n×n(n为偶数)矩阵是否为“对称矩阵”,对称矩阵需同时满足左右对称上下对称两个条件,且需处理多组测试样例。具体逻辑如下:

    1. 左右对称:对矩阵的每一行i,该行第j个元素(0-based下标,即从0开始计数)需与第n-1-j个元素相等(比如n=4时,第0列和第3列、第1列和第2列需相等)。
    2. 上下对称:对矩阵的每一列j,该列第i个元素需与第n-1-i个元素相等(比如n=4时,第0行和第3行、第1行和第2行需相等)。
    3. 多组测试样例:需逐个处理每组数据,一旦某组数据不满足任一对称条件,立即输出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函数封装单组样例处理逻辑,避免主函数冗长。

    新知识

    1. 输入输出优化(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矩阵可能超时。
    2. 模块化函数(solve):

      • 术语:将单组测试样例的“输入→检查→输出”逻辑封装为独立函数solve()
      • 解释:主函数仅负责读取测试样例组数,具体逻辑交给solve(),代码结构更清晰,便于调试和维护。
      • 对比:C语言需在主函数内用循环嵌套处理逻辑,代码层级较深;C++模块化后,主函数更简洁。
    3. 类型定义与常量:

      • 术语:#define int long longconst 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++模块化函数的参数传递与返回值设计。

    • 1

    信息

    ID
    490
    时间
    1000ms
    内存
    256MiB
    难度
    5
    标签
    (无)
    递交数
    27
    已通过
    9
    上传者