酷代码 AI
菜单

一个 行 列的螺旋矩阵可由如下方法生成: 从矩阵的左上角(第 行第 列)出发,初始时向右移动;如果前方是未曾经过的格子,则继续前进,否则右转;重复上述操作直至经过矩阵中所有格子。根据经过顺序,在格子中依次填入 ,便构成了一个螺旋矩阵。 下图是一个 时的螺旋矩阵。 1 2 3 4 12 13 14 5 11 16 15 6 10 9 8 7 现给出矩阵大小 以及 和 ,请你求出该矩阵中第 行第 列的数是多少。 输入 共一行,包含三个整数 , , ,每两个整数之间用一个空格隔开,分别表示矩阵大小、待求的数所在的行号和列号。 输出 一个整数,表示相应矩阵中第 行第 列的数。 样例输入 复制 4 2 3 样例输出 复制 14 提示 【数据说明】 对于 的数据, ; 对于 的数据, 。 来源/分类 递归

```cpp #include <iostream> #include <algorithm> using namespace std; int main() { int n, i, j; cin >> n >> i >> j; // 计算目标位置所在的最小层数(从外向内数) int layer = min(min(i, j), min(n - i + 1, n - j + 1)); // 计算当前层之前所有层包含的数字个数 // 第k层包含的数字个数为:4 * (n - 2*(k-1) - 1) // 前layer-1层的总数字个数 int sum = 0; for (int k = 1; k < layer; k++) { sum += 4 * (n - 2*(k-1) - 1); } // 计算目标位置在当前层的相对位置 int startRow = layer; int startCol = layer; int endRow = n - layer + 1; int endCol = n - layer + 1; int result; // 目标位置在当前层的上边 if (i == startRow) { result = sum + (j - startCol + 1); } // 目标位置在当前层的右边 else if (j == endCol) { result = sum + (endCol - startCol) + (i - startRow + 1); } // 目标位置在当前层的下边 else if (i == endRow) { result = sum + 2*(endCol - startCol) + (endCol - j + 1); } // 目标位置在当前层的左边 else { result = sum + 3*(endCol - startCol) + (endRow - i + 1); } cout << result << endl; return 0; } ``` 代码说明: 1. 计算层数:`layer = min(min(i, j), min(n - i + 1, n - j + 1))` 确定目标位置(i,j)位于从外向内数的第几层。 2. 计算前layer-1层的数字总数: 第k层包含`4*(n-2*(k-1)-1)`个数字,累加前layer-1层得到基础值`sum`。 3. 确定目标位置在当前层的哪条边: - 上边:行号等于当前层起始行 - 右边:列号等于当前层结束列 - 下边:行号等于当前层结束行 - 左边:列号等于当前层起始列 4. 计算最终结果: 基础值`sum`加上在当前层的偏移量。 时间复杂度:O(n),主要消耗在计算前layer-1层数字总数的循环上。 空间复杂度:O(1),只使用了常数个变量。 示例验证: 输入:`4 2 3` - layer = min(min(2,3), min(3,2)) = 2 - sum = 前1层数字总数 = 4*(4-1) = 12 - 目标位置在第2层上边(i=2等于起始行2) - 结果 = 12 + (3-2+1) = 14 输出:`14`,与题目示例一致。 [2026-01-05 12:16:41 | AI问答 | 740点数解答]

服务商
相关提问
发财导航,免费问AI
实用工具查看更多