螺旋佇列問題

2021-06-08 19:10:21 字數 2183 閱讀 3540

下面是乙個螺旋佇列:

73   74   75   76   77   78   79   80  

8172   43   44   45   46   47   48  

4950

71   42   21   22   23   24  

2526   51

70   41   20    7     8      

910   27   52

69   40   19    6  

1 2    11   28   53

68   39   18    5     4     3    12   29   54

67   38   17   16   15   14   13   30   55

66   37   36   35   34   33   32   31   56

65   64   63   62   61   60   59   58   57

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

解析:規律能看出來,問題就在於如何利用它。很明顯這個佇列是順時針螺旋向外擴充套件的,我們可以把它看成一層一層往外延伸。第 0 層規定為中間的那個 1,第 1 層為 2 到 9,第 2 層為 10 到 25,注意到 1、9、25、……不就是平方數嗎?而且是連續奇數(1、3、5、……)的平方數。這些數還跟層數相關,推算一下就可以知道第 t 層之內一共有 (2t-1)^2 個數,因而第 t 層會從 [(2t-1)^2] + 1 開始繼續往外螺旋。給定座標 (x,y),如何知道該點處於第幾層?層數 t = max(|x|,|y|)。

知道了層數,接下來就好辦多了,這時我們就知道所求的那點一定在第 t 層這個圈上,順著往下數就是了。要注意的就是螺旋佇列數值增長方向和座標軸正方向並不一定相同。我們可以分成四種情況——上、下、左、右——或者——東、南、西、北,分別處於四條邊上來分析。

東|右:x == t (

即 x 一定時

),佇列增長方向和 y 軸一致,正東方向(y = 0)數值為 (2t-1)^2 + t,所以 v = (2t-1)^2 + t + y

南|下:y == t (

即 y 一定時

),佇列增長方向和 x 軸相反,正南方向(x = 0)數值為 (2t-1)^2 + 3t,所以 v = (2t-1)^2 + 3t - x

西|左:x == -t (

即 x 一定時

),佇列增長方向和 y 軸相反,正西方向(y = 0)數值為 (2t-1)^2 + 5t,所以 v = (2t-1)^2 + 5t - y

北|上:y == -t (

即 y 一定時

),佇列增長方向和 x 軸一致,正北方向(x = 0)數值為 (2t-1)^2 + 7t,所以 v = (2t-1)^2 + 7t + x

其實還有一點很重要,不然會有問題。其它三條邊都還好,但是在東邊(右邊)那條線上,佇列增加不完全符合公式!注意到東北角(右上角)是本層的最後乙個數,再往下卻是本層的第乙個數,那當然不滿足東線公式啊。所以我們把東線的判斷放在最後(其實只需要放在北線之後就可以),這樣一來,東北角那點始終會被認為是北線上的點。

下面給出第 t 層的圖示說明:

c++**實現:

//螺旋佇列問題

#include 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 main(){

int x,y;

const int n = 4; //需要列印的層數

for(y=-n; y<=n; y++){

for(x=-n; x<=n; x++)

cout<

螺旋佇列問題

問題1 看清以下數字排列的規律,設1點的座標是 0,0 x方向向右為正,y方向向下為正,例如,7的座標為 1,1 2的座標為 1,0 3的座標為 1,1 程式設計實現輸入任意一點座標 x,y 輸出所對應的數字。21 22 20 7 8 9 10 19 6 1 2 11 18 5 4 3 12 17 ...

螺旋佇列問題解法

看到這個怪圖了嗎?對,就是螺旋佇列!看清以上數字排列的規律,設 1 點的座標是 0,0 x 方向向右為正,y 方向向下為正。例如,7 的座標為 1,1 2 的座標為 1,0 3 的座標為 1,1 程式設計實現輸入任意一點座標 x,y 輸出所對應的數字。finland 某著名通訊裝置公司 2005 年...

螺旋佇列問題之c語言

下面是乙個螺旋佇列 73 74 75 76 77 78 79 80 8172 43 44 45 46 47 48 4950 71 42 21 22 23 24 2526 51 70 41 20 7 8 910 27 52 69 40 19 6 1 2 11 28 53 68 39 18 5 4 3 ...