日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

c++面试准备之螺旋队列

發布時間:2024/4/14 c/c++ 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 c++面试准备之螺旋队列 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

摘自http://blog.sina.com.cn/s/blog_4b687eac0100f0oa.html

21? 22? ...
20? 7?? 8?? 9?? 10
19? 6?? 1?? 2?? 11
18? 5?? 4?? 3?? 12
17? 16? 15? 14? 13

??? 看清以上數字排列的規律,設 1 點的坐標是 (0,0),x 方向向右為正,y 方向向下為正。例如,7 的坐標為 (-1,-1),2 的坐標為 (0,1),3 的坐標為 (1,1)。編程實現輸入任意一點坐標 (x,y),輸出所對應的數字。[Finland 某著名通信設備公司 2005 年面試題]

??? 規律是什么?規律真的一看就能看出來,問題就在于如何利用它。

??? 先來個大點的:

???? 43 44 45 46 47 48 49
???? 42 21 22 23 24 25 26
???? 41 20?7??8??9? 10 27
???? 40 19?6? 1??2? 11 28??
???? 39 18?5??4??3? 12 29?
???? 38 17 16 15 14 13 30
???? 37 36 35 34 33 32 31

??? 很明顯這個隊列是順時針螺旋向外擴展的,我們可以把它看成一層一層往外延伸。第?0 層規定為中間的那個 1,第?1 層為 2 到 9,第?2 層為 10 到 25,……好像看出一點名堂來了?注意到 1、9、25、……不就是平方數嗎?而且是連續奇數(1、3、5、……)的平方數。這些數還跟層數相關,推算一下就可以知道第 t 層之內(注意:不包括第t層)一共有 (2t-1)^2 個數——即第0層內有1個數,第1層內有9個數,第2層內有25個數...因而第 t 層會從 [(2t-1)^2] + 1 開始繼續往外螺旋。給定坐標 (x,y),如何知道該點處于第幾層?so easy,層數 t = max(|x|,|y|),例如:(0,1)在第1層為2,(-1,-1)在第1層為7...

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

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

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

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

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

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

??? 實現代碼如下:

#include<stdio.h>

#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));//求出層數t
int u=t + t;
int v=u - 1;
v
=v*v+u;//即v = (2t-1)^2 + 2t
if(x==-t)
v
+=u+t-y;//v = (2t-1)^2 + 5t - y
else if(y==-t)
v
+=3*u+x-t;//v = (2t-1)^2 + 7t + x
else if(y==t)
v
+=t-x;//v = (2t-1)^2 + 3t - x
else
v
+=y-t;//v = (2t-1)^2 + t + y
return v;

}
void main()

{
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(
"%d\n",foo(x,y));

return 0;

}

總結

以上是生活随笔為你收集整理的c++面试准备之螺旋队列的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。