輸入n,求一個n*n矩陣,規定矩陣沿45度線遞增(威盛)
/**
* 獲得以下樣式的二維數組
* zigzag(jpeg編碼裏取象素數據的排列順序)
*
* 0, 1, 5, 6,14,15,27,28,
* 2, 4, 7,13,16,26,29,42,
* 3, 8,12,17,25,30,41,43,
* 9,11,18,24,31,40,44,53,
* 10,19,23,32,39,45,52,54,
* 20,22,33,38,46,51,55,60,
* 21,34,37,47,50,56,59,61,
* 35,36,48,49,57,58,62,63
*/
程序員
這個題目是在《程序員面試寶典》上看到的,可是書中只貼出了代碼。懶得看別人的代碼,本身網上搜了下,竟然發現沒有人講思考的思路的,因此本身就思考了一下。面試
個人算法的主要思路是:算法
1.遞增的方向只有2個:左下,右上。 若是以前是按左下遞增,那麼以後是按右上遞增,再按左下方遞增
2.同一個斜線上數據的規律是:下標(i+j)的和都同樣。數組
如下是個人代碼:編碼
#define N 8 enum direction{LD=0,RU}; //方向:左下,右上spa void main() { direction dir = RU; //初始方向爲往:右上方 int count = 0; //count用於計數 int arr[N][N]={0}; int k=0,i,j; //i,j是數組下標,k是第幾條斜線的意思 while(k<=(N-1)*2) { for( i = 0;i<N;i++) { for(j=0;j<N;j++) { if(i+j==k) //對於數組中同一斜線的數 { int temp1 = k; int temp2 = 0; if(k>=N-1) {temp1 = N-1;temp2=k-N+1;} if(dir==LD){ while(temp1>=0 && temp2<N ) { arr[temp1--][temp2++] = count++; } dir = RU; } else{ while(temp1>=0 && temp2<N) { arr[temp2++][temp1--] = count++; } dir = LD; } k++; } } } } //--------print array-------- for(i=0;i<N;i++) { for(j=0;j<N;j++) { printf("%3d ",arr[i][j]); } cout<<endl; } }3d |
|