P2239 [NOIP 2014 普及组] 螺旋矩阵

题目背景

NOIP2014 普及组 T3

题目描述

一个 nnn 行 $ n$ 列的螺旋矩阵可由如下方法生成:

从矩阵的左上角(第 111 行第 111 列)出发,初始时向右移动;如果前方是未曾经过的格子,则继续前进,否则右转;重复上述操作直至经过矩阵中所有格子。根据经过顺序,在格子中依次填入 1,2,3,…,n21, 2, 3, \dots, n^21,2,3,,n2,便构成了一个螺旋矩阵。

下图是一个 n=4n = 4n=4 时的螺旋矩阵。

(12341213145111615610987)\begin{pmatrix} 1 & 2 & 3 & 4 \\ 12 & 13 & 14 & 5 \\ 11 & 16 & 15 & 6 \\ 10 & 9 & 8 & 7 \\ \end{pmatrix}11211102131693141584567

现给出矩阵大小 nnn 以及 iiijjj,请你求出该矩阵中第 iii 行第 jjj 列的数是多少。

输入格式

共一行,包含三个整数 nnn, iii, jjj,每两个整数之间用一个空格隔开,分别表示矩阵大小、待求的数所在的行号和列号。

输出格式

一个整数,表示相应矩阵中第 iii 行第 jjj 列的数。

输入输出样例 #1

输入 #1

4 2 3

输出 #1

14

说明/提示

【数据说明】

对于 50%50\%50% 的数据,1⩽n⩽1001 \leqslant n \leqslant 1001n100;

对于 100%100\%100% 的数据,1⩽n⩽30,000,1⩽i⩽n,1⩽j⩽n1 \leqslant n \leqslant 30,000,1 \leqslant i \leqslant n,1 \leqslant j \leqslant n1n30,000,1in,1jn

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考级编程题实现、白名单赛事考题实现,记录日常的编程生活、比赛心得,感兴趣的请关注,我后续将继续分享相关内容

Logo

集算法之大成!助力oier实现梦想!

更多推荐