先從乙個面試題開始:
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...