如果我们用方向向量那么做的话
我们时间复杂度会很高是一方面,我们也开不了这么大的二维数组
so我们可以选择用递归来做
我们不断的把包围矩阵的外层剥开,然后看看我们要查询的新值是不是在新矩阵的外围里面
如果要找的点,位于边界的时候,就说明,我们可以找到目标值了,
我们的begin是从第一个数前一个数开始,分四个情况
i等于1的时候,要找的数ret = begin+j
j=n的时候,ret=begin+n-1+i
i=n的时候,ret = 2*(n-1)+(n-j+1) 化简之后就是 begin+3*n-1-j
j=1的时候,ret = 3*(n-1)+(n-i+1) 化简之后begin+4*n-2-i
当然,如果我们第一次不是在边界,就要把外层剥开去n-2*n-2的子矩阵里继续寻找我们的目标值,这时候我们要找的位置就是i-1,j-1 开始位置就是begin+4*(n-1) 新的矩阵大小就是n-2*n-2
好的,这时候我们实现一下代码
#include <iostream>
typedef long long ll;
using namespace std;
ll n,i,j;
ll dfs(ll n,ll i,ll j,ll begin)
{
if(i==1) return begin+j;
else if(j==n) return begin+n-1+i;
else if(i==n) return begin+3*n-1-j;
else if(j==1) return begin+4*n-2-i;
return dfs(n-2,i-1,j-1,begin+4*(n-1));
}
int main()
{
cin >> n >> i >> j;
cout << dfs(n,i,j,0);
return 0;
}