您的位置:首页 > 其它

输入n,求一个n×n矩阵,规定矩阵沿45度递增,形成zigzag数组

2012-08-25 00:00 274 查看
输入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

={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;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐