螺旋隊列---最簡分析及代碼實現

一、問題描述

1的座標是(00),向右的方向爲X正方向,向下爲Y正方向。例如:7的座標爲(-1,-1), 2的座標爲(01)。編程實現輸入任意一點座標(xy),輸出所對應的數字

 

二、問題分析

從圖中不難發現,向右X正方向的增長規律爲:121128等,因此可用一個通用的公式描述爲: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");
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章