求回旋矩阵任意坐标处的值

1.回旋矩阵如下

21    22    23    24    25

20    07    08    09    10

19    06    01    02    11

18    05    04    03    12

17    16    15    14    13

2.问题描述

假设 01 的坐标是(0,0),X向右为正,Y向下为正,如:07的坐标是(-1,-1)

求给定坐标(x,y)处的值

3.问题求解

斜上角线上的数是有规律的:01,09,25,49……

分别是 1^2,3^2,5^2,7^2……

得出最右下角的数的值,可以继而求得其他三个象限的值

4.代码

//求回旋矩阵任意坐标处的值
// 21 22 23 24 25
// 20 07 08 09 10
// 19 06 01 02 11
// 18 05 04 03 12
// 17 16 15 14 13
//
// 01的坐标是(0,0)
// 向右为正,向下为正
// 07的坐标是(-1,-1)
//cc 2012.08.27
#include <stdio.h>

#define max(a,b)(((a)>(b))?(a):(b))
#define abs(a) (((a)>0)?(a):(-a))

#define ROUND 5
int foo(int x,int y){
	int t=max(abs(x),abs(y));
	//u是最大曾数最右上角和最右下角的差值
	//v是最大层数最右下角的数的值
	//右上角的值为 (2t-1)^2 即:1,9,25,49
	//根据最右上角算最右下角 即:
	//最右下角的值为:(2t-1)^2+u=(2t-1)^2+2t=4t^2-2t+1
	int u=2*t;
	int v=4*t*t-2*t+1;

	//左半边
	if(x==-t){
		v+=u+t-y;
	}
	//上半边
	else if(y==-t){
		v+=3*u+x-t;
	}
	//下半边
	else if(y==t){
		v+=t-x;
	}
	//右半边
	else{
		v+=y-t;
	}
	return v;
}
int main(){
	int x,y;
	for(y=-ROUND;y<=ROUND;y++){
		for(x=-ROUND;x<=ROUND;x++){
			printf("%03d ",foo(x,y));
		}
		putchar('\n');
	}
	while(scanf("%d %d",&x,&y)==2){
		printf("<%d,%d>:%d\n",x,y,foo(x,y));
	}
	return 0;
}


你可能感兴趣的:(求回旋矩阵任意坐标处的值)