3 条题解

  • 0
    @ 2026-6-9 15:21:41

    为你提供这道题的数据生成器(C++版本)。

    考虑到这道题的输入数据范围是 2n402 \le n \le 40。数据规模非常小,最大的测试点(n=40n=40)输出也只有 40×40=160040 \times 40 = 1600 多个字符,远低于 2MB 的限制。任何两重循环的解法无论如何都不会超时(即使是最笨的解法也能在 11 毫秒内出解)。

    因此,这个数据生成器的区分度重点完全放在了对“逻辑边界”(尤其是 26 个字母循环的边界)的测试上,用于排查部分学生使用硬编码或者取模逻辑存在缺陷的代码。

    测试点设计策略 (共10个点):

    • Test 1 (边界验证): n=2n = 2,题目的最小边界限制。
    • Test 2 (样例验证): n=3n = 3,题目样例1,验证基本逻辑。
    • Test 3 (样例验证): n=5n = 5,题目样例2,验证递推。
    • Test 4 (常规小数据): n=10n = 10,常规规模测试。
    • Test 5 (常规中数据): n=15n = 15,常规规模测试。
    • Test 6 (未越界极限): n=25n = 25,第一行刚好到 Y,所有行/列的首个循环尚未触发对 A 的回卷。
    • Test 7 (对齐 26 的周期边界): n=26n = 26,极其关键!第一行刚好从 A 走到 Z 结束,不触发回卷;但第二行立刻开始回卷,测试学生是否把边界条件写错(如写成了 >=26 或是 >26 的Off-By-One经典错误)。
    • Test 8 (刚好越过周期): n=27n = 27,第一行刚好发生一次回卷(输出以 A 结尾),用来专门狙击手动维护字母递增但重置条件写错的代码。
    • Test 9 (高中等规模): n=33n = 33,测试发生多轮回卷后的稳定性。
    • Test 10 (最大边界): n=40n = 40,题目要求的最大数据规模,考察是否存在越界,及多次取模循环后的正确性。

    数据生成器 C++ 源码:

    你可以直接编译并运行以下代码,它会在同级目录下自动生成 1.in ~ 10.in 和对应的 1.out ~ 10.out 文件。

    #include <iostream>
    #include <fstream>
    #include <string>
    #include <vector>
    
    using namespace std;
    
    // 标准答案核心逻辑:根据大小生成矩阵图案
    vector<string> solve(int n) {
        vector<string> res;
        for (int i = 0; i < n; ++i) {
            string row = "";
            for (int j = 0; j < n; ++j) {
                // 最优且最稳妥的取模计算偏移量方法
                row += (char)('A' + (i + j) % 26);
            }
            res.push_back(row);
        }
        return res;
    }
    
    int main() {
        // 根据策略精心挑选的 10 个 n 的值
        int test_cases[11] = {0, 2, 3, 5, 10, 15, 25, 26, 27, 33, 40};
    
        // 循环生成 10 组输入输出文件
        for (int i = 1; i <= 10; ++i) {
            int n = test_cases[i];
            
            string in_name = to_string(i) + ".in";
            string out_name = to_string(i) + ".out";
            
            // 写入 .in 文件
            ofstream fin(in_name);
            if (!fin) {
                cerr << "无法创建文件 " << in_name << "\n";
                continue;
            }
            fin << n << "\n";
            fin.close();
            
            // 生成标准输出
            vector<string> results = solve(n);
            
            // 写入 .out 文件
            ofstream fout(out_name);
            if (!fout) {
                cerr << "无法创建文件 " << out_name << "\n";
                continue;
            }
            for (const string& row : results) {
                fout << row << "\n";
            }
            fout.close();
            
            cout << "成功生成 Test Case " << i << " (n = " << n << ") -> " << in_name << ", " << out_name << "\n";
        }
        
        cout << "全部 10 组测试数据生成完毕!" << endl;
        return 0;
    }
    

    使用方式:

    1. 将上述代码保存为 data_generator.cpp
    2. 在终端/命令行中进行编译:g++ data_generator.cpp -o data_generator -O2
    3. 运行程序:./data_generator (在 Windows 下则是 data_generator.exe)。
    4. 程序运行瞬间完成,当前文件夹下会出现 1.in, 1.out10.in, 10.out 的全部文件,直接打包ZIP上传至你们的 OJ 系统进行测评即可。

    OJ部署提醒:

    • 内存限制(Memory Limit): 128MB 或 256MB 绰绰有余。
    • 时间限制(Time Limit): 1.0秒(由于最大复杂度只有 O(402)O(40^2) 即不到 2000 次操作,就算是用 Python 等脚本语言也可以在 0.01 秒内无压力 AC)。

    信息

    ID
    13927
    时间
    1000ms
    内存
    128MiB
    难度
    1
    标签
    递交数
    1
    已通过
    1
    上传者