【题目描述】
一个 n 行 n 列的螺旋矩阵可由如下方法生成:
从矩阵的左上角(第 1 行第 1 列)出发,初始时向右移动;如果前方是未曾经过的格子,则继续前进,否则右转;重复上述操作直至经过矩阵中所有格子。根据经过顺序,在格子中依次填入 1, 2, 3, ... , n ,便构成了一个螺旋矩阵。
下图是一个 n = 4 时的螺旋矩阵。
| 11 | 22 | 33 | 44 |
| 1212 | 1313 | 1414 | 55 |
| 1111 | 1616 | 1515 | 66 |
| 1010 | 99 | 88 | 77 |
现给出矩阵大小 n 以及 i 和 j,请你求出该矩阵中第 i 行第 j 列的数是多少。
【输入】
输入共一行,包含三个整数n,i,j,每两个整数之间用一个空格隔开,分别表示矩阵大小、待求的数所在的行号和列号。
【输出】
输出共一行,包含一个整数,表示相应矩阵中第 i 行第 j 列的数。
【输入样例】
4 2 3
【输出样例】
14
【提示】
14
【提示】
【数据说明】
对于 50%的数据,1 ≤ n ≤ 100;
对于 100%的数据,1 ≤ n ≤ 30,000,1 ≤ i ≤ n,1 ≤ j ≤ n。
这道题为学代码的everybody中常见的一道题——螺旋矩阵。
此题容易出错,读者请谨慎。
以下是我的代码,代码中有详细解析↓↓↓
#includeusing namespace std; int getNum(int l, int i, int j)//左上角(1,1)位置的值为1,边长为l的矩阵中(i,j)的值 { if(i == 1)//如果在上边 return j; else if(j == l)//如果在右边 return l-1+i; else if(i == l)//如果在下边 return 2*(l-1)+l-j+1; else if(j == 1)//如果在左边 return 3*(l-1)+l-i+1; else//如果在内部 i,j位置的值为这一圈元素的个数(4*(l-1))加上以(2,2)位置为左上角,以l-2长度为边的矩阵中,(i-1,j-1)位置的值。 return 4*(l-1)+getNum(l-2, i-1, j-1);//以(2,2)位置为左上角时, 原(2,2)变为(1,1),原(i,j)变为(i-1,j-1) } int main() { int n, ai, aj;//求(ai,aj)的数 st:该圈起始数字 cin >> n >> ai >> aj; cout << getNum(n, ai, aj); return 0; }
此题为信息学奥赛一本通(C++版)在线评测系统 1967:【14NOIP普及组】螺旋矩阵
这道题的代码其实比较短,重在考虑思路,思路搞懂后这道题便轻松解决哦!!!
谢谢大家━((*′д`)爻(′д`*))━!!!!



