NOIP2014普及组--螺旋矩阵

NOIP2014普及组–螺旋矩阵

在这里插入图片描述
这道题一看貌似就是原来做过的一道叫蛇形矩阵(http://219.153.61.2:9000/problem/55) 的题,可是显然不是,那道题是需要保存的,因为需要打印整个二位数组,但是这道题是输出给定位置的值,而且
要是把整个矩阵打出来一耗时间而耗空间,而且可能拿五十分都做不到,所以就要观察原图,找寻规律;
我们可以把整个矩阵分作几个不同部分,一个部分就是一个圈,因为每个圈的边长也易求,起点值易求,所以只需找到所需点坐标在哪个圈的距起点何处即可;

#include<bits/stdc++.h>
using namespace std;
long long n,mx,my,idx,tot;
long long se[31000][3];
long long e;
int main() {
//	freopen("matrix.in","r",stdin);
//	freopen("matrix.out","w",stdout);
	cin>>n>>mx>>my;
	e=n*n;
	for(int i=1; 1; i++) {
		if(i&1)
			se[++idx][0]=se[idx-1][0]+1;
		else se[++idx][0]=se[idx-1][0]+(n-idx+1)*4-1;
		if(se[idx][0]==e) break;
	}
	for(int i=1; i<=idx; i++) {
		if(i&1) {
			se[i][1]=n-i+1;
		} else se[i][1]=se[i-1][1];
	}
	for(int i=1; i<=idx; i++) {
		if(i&1) {
			tot++;
			se[i][2]=tot;
		}
	}
	int c=min(mx,n-mx+1);
	int d=min(my,n-my+1);
	for(int i=1; i<=idx; i++) {
		if(se[i][2]) {
			if(c==se[i][2]&&d>=se[i][2]&&d<=se[i][2]+se[i][1]-1||d==se[i][2]&&c>=se[i][2]&&c<=se[i][2]+se[i][1]-1) {
				if(mx==se[i][2]&&my==se[i][2]){
					cout<<se[i][0];
					return 0;
				}
				if(mx==se[i][2]) {
					cout<<se[i][0]+my-se[i][2];
					return 0;
				}
				if(n-mx+1==se[i][2]) {
					cout<<se[i][0]+3*(se[i][1]-1)-my+se[i][2];
					return 0;
				}
				if(my==se[i][2]) {
					cout<<se[i][0]+4*(se[i][1]-1)-mx+se[i][2];
					return 0;
				}
				if(n-my+1==se[i][2]){
					cout<<se[i][0]+(se[i][1]-1)+mx-se[i][2];
					return 0;
				}
			}
		}
	}
}\\因为可能要重复输出所以要提前return;
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值