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