一、问题描述
设1的坐标是(0,0),向右的方向为X正方向,向下为Y正方向。例如:7的坐标为(-1,-1), 2的坐标为(0,1)。编程实现输入任意一点坐标(x,y),输出所对应的数字
二、问题分析
从图中不难发现,向右X正方向的增长规律为:1,2,11,28等,因此可用一个通用的公式描述为:XPlusVal = (2*ulMaxValue-1)(2* ulMaxValue-1)+ulMaxValue,其中ulMaxValue=max(abs(x),abs(y)),x,y当然是对应输入任意的坐标点。
计算出一条主线后,就分4个判断区域,分别判断,点落在该圈4条边的哪条边上,从而计算出具体坐标点的值。
y== max(abs(x),abs(y))区:retVal = XPlusVal + ulMaxVal - x;
x== -max(abs(x),abs(y))区:retVal = XPlusVal + 3*ulMaxVal - y;
y==- max(abs(x),abs(y))区:retVal = XPlusVal + x + 5*ulMaxVal;
x== max(abs(x),abs(y))区:retVal = XPlusVal + y - ulMaxVal;
三、代码实现
#include <stdio.h>
#include <stdlib.h>
#define abs(a) (a)>0?(a):(-a)
#define max(a, b) (a)>(b)?(a):(b)
int Spiral(int x, int y)
{
int XPlusVal, retVal, ulMaxVal;
//Get max point
ulMaxVal = max(abs(x), abs(y));
//Calc X+ Result
XPlusVal = (2*ulMaxVal-1)*(2*ulMaxVal-1) + 2*ulMaxVal;
//use (x,y)
if(x == -ulMaxVal){
retVal = XPlusVal + 3*ulMaxVal - y;
}else if(y == -ulMaxVal){
retVal = XPlusVal + x + 5*ulMaxVal;
}else if(y == ulMaxVal){
retVal = XPlusVal + ulMaxVal - x;
}else{
retVal = XPlusVal + y - ulMaxVal;
}
return retVal;
}
int main()
{
int xPoint, yPoint;
for(xPoint = -5; xPoint <= 5; xPoint++){
for(yPoint = -5; yPoint <= 5; yPoint++){
printf("%5d", Spiral(yPoint,xPoint));
}
printf("\n");
}
system("pause");
}