亚洲最大看欧美片,亚洲图揄拍自拍另类图片,欧美精品v国产精品v呦,日本在线精品视频免费

  • 站長(zhǎng)資訊網(wǎng)
    最全最豐富的資訊網(wǎng)站

    c語(yǔ)言寫(xiě)螺旋隊(duì)列并分析

     

      21 22 ……

      20 7 8 9 10 19 6 1 2 11 18 5 4 3 12 17 16 15 14 13看清以上數(shù)字排列的規(guī)律,設(shè) 1 點(diǎn)的坐標(biāo)是 (0,0),x 方向向右為正,y 方向向下為正。例如,7 的坐標(biāo)為 (-1,-1),2 的坐標(biāo)為 (0,1),3 的坐標(biāo)為 (1,1)。編程實(shí)現(xiàn)輸入任意一點(diǎn)坐標(biāo) (x,y),輸出所對(duì)應(yīng)的數(shù)字。[Finland 某著名通信設(shè)備公司 2005 年面試題]

      規(guī)律是什么?規(guī)律真的一看就能看出來(lái),問(wèn)題就在于如何利用它。很明顯這個(gè)隊(duì)列是順時(shí)針螺旋向外擴(kuò)展的,我們可以把它看成一層一層往外延伸。第 0 層規(guī)定為中間的那個(gè) 1,第 1 層為 2 到 9,第 2 層為 10 到 25,……好像看出一點(diǎn)名堂來(lái)了?注意到 1、9、25、……不就是平方數(shù)嗎?而且是連續(xù)奇數(shù)(1、3、5、……)的平方數(shù)。這些數(shù)還跟層數(shù)相關(guān),推算一下就可以知道第 t 層之內(nèi)一共有 (2t-1)^2 個(gè)數(shù),因而第 t 層會(huì)從 [(2t-1)^2] + 1 開(kāi)始繼續(xù)往外螺旋。給定坐標(biāo) (x,y),如何知道該點(diǎn)處于第幾層?so easy,層數(shù) t = max(|x|,|y|)。

      知道了層數(shù),接下來(lái)就好辦多了,這時(shí)我們就知道所求的那點(diǎn)一定在第 t 層這個(gè)圈上,順著往下數(shù)就是了。要注意的就是螺旋隊(duì)列數(shù)值增長(zhǎng)方向和坐標(biāo)軸正方向并不一定相同。我們可以分成四種情況——上、下、左、右——或者——東、南、西、北,分別處于四條邊上來(lái)分析。

     

      東|右:x == t,隊(duì)列增長(zhǎng)方向和 y 軸一致,正東方向(y = 0)數(shù)值為 (2t-1)^2 + t,所以 v = (2t-1)^2 + t + y

      南|下:y == t,隊(duì)列增長(zhǎng)方向和 x 軸相反,正南方向(x = 0)數(shù)值為 (2t-1)^2 + 3t,所以 v = (2t-1)^2 + 3t – x

      西|左:x == -t,隊(duì)列增長(zhǎng)方向和 y 軸相反,正西方向(y = 0)數(shù)值為 (2t-1)^2 + 5t,所以 v = (2t-1)^2 + 5t – y

      北|上:y == -t,隊(duì)列增長(zhǎng)方向和 x 軸一致,正北方向(x = 0)數(shù)值為 (2t-1)^2 + 7t,所以 v = (2t-1)^2 + 7t + x

     

      其實(shí)還有一點(diǎn)很重要,不然會(huì)有大 bug.其它三條邊都還好,但是在東邊(右邊)那條線上,隊(duì)列增加不完全符合公式!注意到東北角(右上角)是本層的最后一個(gè)數(shù),再往下卻是本層的第一個(gè)數(shù),那當(dāng)然不滿(mǎn)足東線公式啊。怎么辦?好辦。反正其它三條都滿(mǎn)足不是嗎,我們把東線的判斷放在最后(其實(shí)只需要放在北線之后就可以),這樣一來(lái),東北角那點(diǎn)始終會(huì)被認(rèn)為是北線上的點(diǎn)啦~

     

      #include #define max(a,b) ((a)<(b)?(b):(a))

      #define abs(a) ((a)>0?(a):-(a))

      int foo(int x,int y){ int t=max(abs(x),abs(y));int u=t+t;int v=u-1;v=v*v+u;if(x==-t)

      v+=u+t-y;else if(y==-t)

      v+=3*u+x-t;else if(y==t)

      v+=t-x;else v+=y-t;return v;} int main (int argc,char *argv[])

      { int x,y;for(y=-4;y<=4;y++){ for(x=-4;x<=4;x++)

      printf(“%5d”,foo(x,y));printf(“n”);} while(scanf(“%d%d”,&x,&y)==2)

      printf(“%dn”,foo(x,y));return 0;}

     

    贊(0)
    分享到: 更多 (0)
    網(wǎng)站地圖   滬ICP備18035694號(hào)-2    滬公網(wǎng)安備31011702889846號(hào)