輸入n,求一個n×n矩陣,規定矩陣沿45度遞增,造成zigzag數組

輸入n,求一個n×n矩陣,規定矩陣沿45度遞增,造成zigzag數組
2010-08-25 9:19

輸入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

相關文章
相關標籤/搜索