一、問題描述
設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");
}