面試題:螺旋隊列

下面是一個螺旋隊列:
螺旋隊列

問題: 看清以上數字排列的規律,設1點的座標是(0,0),x方向向右爲正,y方向向下爲正。例如:7的座標爲(-1,-1),2的座標爲(0,1),3的座標爲(1,1)。編程實現輸入任意一點座標(x,y),輸出所對應的數字;或輸入任意數字,輸出該數字的座標。

解析:
我們從圖片中可以觀察到,這個螺旋隊列是順時針螺旋向外擴展的。我們可以把它看成一層一層向外延伸,第0層爲中間的那個1,第1層爲2到9,第2層爲10到25,第三層爲26到49。我們可以看出,每一層都有一個最大值max。例如我們就看,第0層到第3層的最大值依次爲,1,9,25,49.所以我們可以總結規律,設層數爲c,則max=(2*c+1)^2;而c = (|x|,|y|);
我們的下一步工作就是分別找上下左右四條邊上的值與max的對應關係:
上邊:Utop = max+(x+y);
左邊: Uleft= max+(3*x-y);
下邊:Ubottom = max + (-x - 5*y);
右邊:Uright = max+(-7*x+y);
螺旋座標

代碼實現:

#include<iostream>
using namespace std;

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

//輸入座標,輸出對應的數字

int Spiral_Queue(int x, int y)
{
    int c = max(abs(x), abs(y));// 該座標所在第幾層
    int max = square(2 * c + 1); //該層的最大值

    if (y == -c) //上
        return max +( x + y);
    else if (x == -c) //左
        return max + (3 * x - y);
    else if (y == c) //下
        return max +(- x - 5 * y);
    else  //右
        return max +(- 7 * x + y);

}

void Spiral_QueueTest()
{
    int x, y;
    const int N = 4; //需要打印的層數
    for (y = -N; y <= N; y++)
    {
        for (x = -N; x <= N; x++)
            cout << Spiral_Queue(x, y) << "  ";
        cout << endl;           //按y層打印,換行  
    }
}
發佈了103 篇原創文章 · 獲贊 53 · 訪問量 15萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章