IT公司面試題收集整理—C相關—螺旋隊列演算法精講(數學很重要呀)

來源:互聯網
上載者:User

根據圈子數n,請輸出螺旋隊列:如
 
為了更好的講解這個演算法,我另外畫一個圖
 
首先說一下這個圖
我們把圖放在x,y軸上,然後右邊是x正半軸,左邊是x的負半軸。上邊是y的正半軸,下邊是y的負半軸
然後整個圖被一個大大的紅叉劃分成上下左右四塊地區。

開始分析:
1. 代碼很明顯是根據(x,y)座標得到資料的。所以我們寫出主函數的代碼。
2. 再寫螺旋函數的時候,我們很明顯的發現rightUp=(2*n+1)*(2*n+1)並且左下角leftDown=(2*n)*(2*n)+1
3. 那麼我們就應該先求n=max(abs(x),abs(y));
4. 然後求出左下角和右上方的值。(這樣的話,與他同行同列的值都能求的【除了右上方下邊的值】)
5. 然後根據n值與x,y的比較,進列區域的劃分。沒錯,就是劃分為上下左右四個地區。
6. 那麼現在有一個比較大的問題,就是我們可以根據右上和左下的資料得到同行或者同列的值。但是我們不能根據右上方的值得到右上方下邊的值【即右地區的值】,因為可以說這個地區值與左下角值與右上方值沒有關係【實際上是有關係的,為了簡單,我們不再討論】。那麼這個問題怎麼解決呢?實際上很簡單。我們只要先判斷上下左即可,最後判斷右的時候,x,y相等的情況已經被前面三個過濾過了。就可以了。所以我們定義了下面的代碼
#define max(a,b) ((a)>(b)?(a):(b))
#define abs(x) ((x)>0?(x):-(x))
7.所以說,數學功力有多深,決定程式員走多遠。這是我們老師說的。我越來越體會到了這句話的意思。

代碼如下

#include<stdio.h>#define max(a,b) ((a)>(b)?(a):(b))#define abs(x) ((x)>0?(x):-(x))int spiral(int x,int y){int result;//要返回的結果int n=max(abs(x),abs(y));//返回較大的數值,既是現在所在位置的層數nint rightUp=(2*n+1)*(2*n+1);//返回所在層數的右上方的值,也是正方形中的最大值int leftDown=4*n*n+1;//返回所在層數的左下角的值if(n==-x){result=leftDown+abs(x-y);}else if(n==y){result=rightUp-abs(x-y);}else if(n==-y){result=leftDown-abs(x-y);}else{result=leftDown-2*n-abs(x+y);}return result;}int main(void){// 輸出螺旋隊列int n,x,y;printf("請輸入螺旋隊列的圈數n:");scanf("%d",&n);for(y=n;y>=-n;y--){for(x=-n;x<=n;x++){printf("%8d",spiral(x,y));}printf("\n");}return 0;}

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.