酷代码 AI
菜单
服务商

螺旋矩阵:根据输入行列号精准求出对应位置数字的算法揭秘

```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`,与题目示例一致。 ######[AI问答 | 740点数解答 | 2026-01-05 12:16:41]

相关提问
本站限时免费提问中
实用工具查看更多
Linux在线手册 [开发类]
Jquery在线手册 [开发类]
今日油价 [生活类]
图片互转base64 [开发类]
时间转换器 [开发类]