P2239 [NOIP2014 普及组] 螺旋矩阵 题解
文章目录
- 题目描述
- 输入格式
- 输出格式
- 样例
- 样例输入
- 样例输出
- 数据范围与提示
- 完整代码
题目描述
一个 n n n 行 $ n$ 列的螺旋矩阵可由如下方法生成:
从矩阵的左上角(第 1 1 1 行第 1 1 1 列)出发,初始时向右移动;如果前方是未曾经过的格子,则继续前进,否则右转;重复上述操作直至经过矩阵中所有格子。根据经过顺序,在格子中依次填入 1 , 2 , 3 , . . . , n 2 1, 2, 3, ... , 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 列的数。
样例
样例输入
4 2 3
样例输出
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。
【题目来源】NOIP 2014 普及组 T3
完整代码
#include<bits/stdc++.h>
using namespace std;
int main()
{
//高级的食材往往只需要最简单的烹饪方式。
int n,i,j,minn,ans;
scanf("%d%d%d",&n,&i,&j);
minn=min(i,min(j,min(n-i+1,n-j+1)));
if(i<=j) printf("%d",minn*(4*(n-1)-4*minn)+10*minn-4*n-3+i+j);
else printf("%d",minn*(4*n-4*minn)+(minn<<1)+1-i-j);
return 0;
}