输入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};   //方向:左下,右上


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;
}
}

转载于:https://my.oschina.net/u/185531/blog/74563

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值