1 条题解
-
0
#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
- 上传者