蓝桥杯备考:螺旋矩阵

如果我们用方向向量那么做的话

我们时间复杂度会很高是一方面,我们也开不了这么大的二维数组

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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

无敌大饺子 dot

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值