C C 學習筆記22 螺旋佇列

2021-06-23 07:18:22 字數 1250 閱讀 4965

先從乙個面試題開始:

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

如下:

分析:這是乙個典型的螺旋佇列。

規律:它是按照順時針方向螺旋向外擴充套件的,我們可以看成是一層層的向外延伸。

第0層規定是:中間的那個1

第1層規定是:2到9的層

第3層規定是:10到25

。。。。。。。。。。

那第t層規定是:

如何確定某個數在第幾層?

t=max(|x|,|y|)

首先通過輸入的x,y可以知道在第幾層,然後知道了第幾層就可以知道了這個數的取值範圍。

然後根據以下幾種情況就可以知道到底是第幾個數,就是如何數得想要的數?

(1)x==t,佇列增長方向與y一致,所以y=0方向上的值是:(2t-1)^2+t,所以v的值為:(2t-1)^2+t+y;

(2)y==t,佇列增長方向與x相反,所以x=0方向上的值是:(2t-1)^2+3t,所以v的值為:(2t-1)^2+3t-x

(3)x==-t,佇列增長方向與y相反,所以y=0方向上的值是:(2t-1)^2+5t,所以v的值為:(2t-1)^2+5t-y

(4)y==-t,佇列增長方向與x一致,所以x=0方向上的值是:(2t-1)^2+7t,所以v的值為:(2t-1)^2+7t-y

#include #define max(a,b) ((a)

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

int foo(int x,int y)

int main()

while (scanf("%d%d",&x,&y)==2)

printf("%d\n",foo(x,y));

return 0;

}

擴充套件:上述是乙個經常性見到的螺旋佇列,那麼還有這樣一種螺旋佇列:

e.g.2:

找出規律,並列印出乙個n * n的矩陣;規律是從首座標開始順時針依次增大?

分析:(1)對於乙個n*n的矩陣,數的範圍為1~n^2

(2)假設最外環的為第0層,則數的範圍為:1~(n-1)^2

C 學習筆記 22

在c 中,auto ptr是乙個類,它用來實現對動態分配物件的自動釋放。建構函式與析構函式 auto ptr在構造時獲取對某個物件的所有權 ownership 在析構時釋放該物件。我們可以這樣使用auto ptr來提高 安全性,類似下面的 int p new int 0 auto ptr ap p ...

Python學習筆記 22

物件導向三大特徵及作用 多型我自己簡單總結一句話 使用方法 或者其他 時,不用考慮物件型別,適用性強,比如常見的len 多型 狗 哈士奇,泰迪,金毛。乙個物件可以以不同的形態去呈現 classa def init self,name self.name name property defname s...

學習筆記2 2續

定義 dp i 1 j 前i種數字是否能構成j 為了用前i種數字加和成j,也就需要能用前i 1種數字加和成j,j ai,j mi x ai中的某一種。我們可以定義如下遞推關係 dp i 1 k 0 k mi且k x ai j時存在dp i j k x ai 為真的k int n,k,a maxn m...