上题:
一个 n 行 n 列的螺旋矩阵可由如下方法生成:
从矩阵的左上角(第 1 行第 1 列)出发,初始时向右移动;如果前方是未曾经过的格子,则继续前进,否则右转;重复上述操作直至经过矩阵中所有格子。根据经过顺序,在格子中依次填入 1, 2, 3, ... , n*n,便构成了一个螺旋矩阵。
下图是一个 n = 5 时的螺旋矩阵。
1 2 3 4 5
16 17 18 19 6
15 24 25 20 7
14 23 22 21 8
13 12 11 10 9
现给出矩阵大小 n 以及 i 和 j,请你求出该矩阵中第 i 行第 j 列的数是多少。
正片开始
众所周知,直接暴力会超时,我推荐用算式
long long n,i,j,mi,ans=0;
cin>>n>>i>>j;
mi=min(i,min(j,min(n-i+1,n-j+1)));
if(i<=j)ans=mi*(4*(n-1)-4*mi)+10*mi-4*n-3+i+j;
else ans=mi*(4*n-4*mi)+2*mi+1-i-j;//模拟过程
最后输出ans
全篇代码
#include<bits/stdc++.h>
using namespace std;
int main(){
long long n,i,j,mi,ans=0;
cin>>n>>i>>j;
mi=min(i,min(j,min(n-i+1,n-j+1)));
if(i<=j)ans=mi*(4*(n-1)-4*mi)+10*mi-4*n-3+i+j;
else ans=mi*(4*n-4*mi)+2*mi+1-i-j;
cout<<ans;
return 0;
}
谢谢