NOIP2014普及组--螺旋矩阵

NOIP2014普及组–螺旋矩阵

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

#include
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<

你可能感兴趣的:(普及组)