
打卡信奥刷题(1173)用C++实现信奥 P2239 [NOIP 2014 普及组] 螺旋矩阵
一个 n 行 n 列的螺旋矩阵可由如下方法生成:从矩阵的左上角(第 1 行第 1 列)出发,初始时向右移动;如果前方是未曾经过的格子,则继续前进,否则右转;重复上述操作直至经过矩阵中所有格子。根据经过顺序,在格子中依次填入 1,2,3,…,n2,便构成了一个螺旋矩阵。
P2239 [NOIP 2014 普及组] 螺旋矩阵
题目背景
NOIP2014 普及组 T3
题目描述
一个 n n n 行 $ n$ 列的螺旋矩阵可由如下方法生成:
从矩阵的左上角(第 1 1 1 行第 1 1 1 列)出发,初始时向右移动;如果前方是未曾经过的格子,则继续前进,否则右转;重复上述操作直至经过矩阵中所有格子。根据经过顺序,在格子中依次填入 1 , 2 , 3 , … , n 2 1, 2, 3, \dots, n^2 1,2,3,…,n2,便构成了一个螺旋矩阵。
下图是一个 n = 4 n = 4 n=4 时的螺旋矩阵。
( 1 2 3 4 12 13 14 5 11 16 15 6 10 9 8 7 ) \begin{pmatrix} 1 & 2 & 3 & 4 \\ 12 & 13 & 14 & 5 \\ 11 & 16 & 15 & 6 \\ 10 & 9 & 8 & 7 \\ \end{pmatrix} 11211102131693141584567
现给出矩阵大小 n n n 以及 i i i 和 j j j,请你求出该矩阵中第 i i i 行第 j j j 列的数是多少。
输入格式
共一行,包含三个整数 n n n, i i i, j j j,每两个整数之间用一个空格隔开,分别表示矩阵大小、待求的数所在的行号和列号。
输出格式
一个整数,表示相应矩阵中第 i i i 行第 j j j 列的数。
输入输出样例 #1
输入 #1
4 2 3
输出 #1
14
说明/提示
【数据说明】
对于 50 % 50\% 50% 的数据, 1 ⩽ n ⩽ 100 1 \leqslant n \leqslant 100 1⩽n⩽100;
对于 100 % 100\% 100% 的数据, 1 ⩽ n ⩽ 30 , 000 , 1 ⩽ i ⩽ n , 1 ⩽ j ⩽ n 1 \leqslant n \leqslant 30,000,1 \leqslant i \leqslant n,1 \leqslant j \leqslant n 1⩽n⩽30,000,1⩽i⩽n,1⩽j⩽n。
C++实现
#include <iostream>
int main() {
int n, x, y;
std::cin >> n >> x >> y;
int a[n][n];
int tmp = 1;
for (int i = 0; i < n / 2 + 1; ++i) {
for(int j = i; j < n - i; ++j)
a[i][j]=tmp++;
for(int j = i + 1; j < n - i; ++j)
a[j][n-i-1]=tmp++;
for(int j = n - i - 2; j > i; --j)
a[n-i-1][j]=tmp++;
for(int j = n - i - 1; j > i; --j)
a[j][i]=tmp++;
}
std::cout << a[x-1][y-1] << std::endl;
}
后续
接下来我会不断用C++来实现信奥比赛中的算法题、GESP考级编程题实现、白名单赛事考题实现,记录日常的编程生活、比赛心得,感兴趣的请关注,我后续将继续分享相关内容
更多推荐
所有评论(0)