1 条题解

  • 0
    @ 2026-1-28 10:25:24
    #include <bits/stdc++.h>
    using namespace std;
    
    // [1] arr数组-存储矩形区域的标记数字,1-based坐标(适配题目(1,1)起点),初始化为0表示未访问
    int arr[20][20] = {};
    // [2] n-矩形的行数(高);m-矩形的列数(宽)
    int n, m;
    // [3] 四个方向偏移量(严格按题目优先级排序):0=右、1=下、2=左、3=上
    int dx[4] = {0, 1, 0, -1};
    int dy[4] = {1, 0, -1, 0};
    
    int main() {
        // [4] 读取矩形的行数n和列数m(输入顺序:高 宽)
        cin >> n >> m;
        // [5] x,y-机器人当前位置坐标(1-based),初始化为起点(1,1)
        int x = 1, y = 1;  
        // [6] num-当前要标记的数字,初始化为1(起点标记为1)
        int num = 1;
        // [7] 初始化起点:将(1,1)标记为1,然后num自增为2(下一个要标记的数字)
        arr[x][y] = num++;
    
        // [8] 核心循环:模拟机器人移动,直到所有n*m个单元格都被标记(num超过总单元格数时终止)
        while (num <= n * m) {
            // [9] 按「右→下→左→上」的优先级遍历方向,寻找第一个可移动的位置
            for (int i = 0; i < 4; ++i) {
                // [10] 计算当前方向下的目标坐标(tx=目标行,ty=目标列)
                int tx = x + dx[i];
                int ty = y + dy[i];
                // [11] 合法性判断:目标坐标在1-based矩形范围内,且未被标记(arr值为0)
                if (tx >= 1 && tx <= n && ty >= 1 && ty <= m && arr[tx][ty] == 0) {
                    // [12] 更新机器人位置为目标坐标
                    x = tx;
                    y = ty;
                    // [13] 标记目标位置为当前数字num,然后num自增(准备下一个数字)
                    arr[x][y] = num++;
                    // [14] 找到可移动方向后立即退出方向循环,继续下一轮移动(保证优先级)
                    break;  
                }
            }
        }
    
        // [15] 遍历矩形,按格式输出标记结果(每个数字占3个字符宽度,不足补空格)
        for (int i = 1; i <= n; ++i) {
            for (int j = 1; j <= m; ++j) {
                // [16] setw(3):设置输出宽度为3,自动补空格,替代手动判断数字位数的繁琐逻辑
                cout << setw(3) << arr[i][j];
            }
            // [17] 每行输出完毕后换行
            cout << endl;
        }
        return 0;
    }
    
    • 1

    信息

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