问题描述
对于一个 n 行 m 列的表格,我们可以使用螺旋的方式给表格依次填上正整数,我们称填好的表格为一个螺旋矩阵。
例如,一个 4 行 5 列的螺旋矩阵如下:
1 2 3 4 5
14 15 16 17 6
13 20 19 18 7
12 11 10 9 8
输入描述
输出描述
输出一个整数,表示螺旋矩阵中第 r 行第 c 列的元素的值。
输入输出样例
示例
输入
4 5
2 2
输出
15
运行限制
- 最大运行时间:1s
- 最大运行内存: 256M
总通过次数: 2518 | 总提交次数: 2741 | 通过率: 91.9%
难度: 困难 标签: 2020, 模拟, 暴力, 省模拟赛
代码:
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
// 声明所需的变量:n(行数),m(列数),r(目标行),c(目标列)
int n, m, r, c;
// 从标准输入读取矩阵的尺寸(n和m)以及目标位置(r和c)
scanf("%d%d%d%d", &n, &m, &r, &c);
// 初始化变量a为1(用于填充矩阵),声明一个二维数组x用于存储螺旋矩阵,最大尺寸为1010x1010
int a = 1, x[1010][1010] = {0}; // 初始化数组x所有元素为0
// 初始化起始位置
int i = 0, j = 0;
x[0][0] = 1; // 将起始位置的值设置为1
// 循环填充矩阵,直到所有元素都被填充
while (a < n * m)
{
// 向右移动填充
while (j + 1 < m && x[i][j + 1] == 0)
x[i][++j] = ++a;
// 向下移动填充
while (i + 1 < n && x[i + 1][j] == 0)
x[++i][j] = ++a;
// 向左移动填充
while (i - 1 >= 0 && x[i - 1][j] == 0)
x[--i][j] = ++a;
// 向上移动填充
while (j - 1 >= 0 && x[i][j - 1] == 0)
x[i][--j] = ++a;
}
// 输出目标位置(r-1, c-1)的值
printf("%d", x[r - 1][c - 1]);
return 0;
}