您的位置:首页 > 编程语言 > C语言/C++

对面试题“输入n,求一个nXn矩阵,规定矩阵沿45度递增,形成一个zigzag数组(JPEG编码里取像素数据的排列顺序),请问如何用C++实现?”的理解

2012-12-03 19:45 896 查看
void print_mat(int **mat, int mat_size)  

{  

    int i, j;  

    cout << "你输入的" << mat_size << "阶ZigZag数组为:"  << endl << endl;  

    for(i = 0; i < mat_size; i++)  

    {  

        for (j = 0; j < mat_size; j++)  

            printf("%5d", mat[i][j]);  

        cout << endl;  

    }  

    cout << endl;  

}  

  

void fill_mat(int **mat, int mat_size)  

{  

  int squa = mat_size * mat_size;  

  int i, j, s;  

  for (i = 0; i < mat_size; i++)  

    for (j = 0; j < mat_size; j++)  

    {  

      s = i + j;  

      if (s < mat_size)  

        mat[i][j] = s * (s + 1) / 2 + (((i + j) % 2) ? i : j);  

      else  

      {  

        s = (mat_size - 1 - i) + (mat_size - 1 - j);  

        mat[i][j] = squa - s * (s + 1) / 2 - (mat_size - ((( i + j) % 2) ? i : j));  

      }  

    }  

}  

 

 

以上代码抄自网上

 

 

首先以自左下角向右上角进行了对角线划分

 

我们为了按行输出,所以让s=i+j,找出数字与行列数值的关系

 

分为两种情况:

一种在对角线左上(n<N):

利用s(s+1)/2可以求出每个行列的值在该值所在斜线中的最小数字;

 

然后分为右上的增加和左上的增加,所以根据行列和对2求余判断奇偶,奇的话为右上的增加,所以我们加上行列值取增加的列,偶的话为左下的增加,所以我们加上行列值取增加的行

 

 mat[i][j] = s * (s + 1) / 2 + (((i + j) % 2) ? i : j);  

 

 

一种在对角线右下(n>N)

这种比较复杂,因为这面的数据是随着每个斜线的的递减,是左上面的逆过程,

通过 s = (mat_size - 1 - i) + (mat_size - 1 - j);  求出斜线左上方对称的斜线的最小值,就如:55斜线对应44斜线

 

 

然后通过s(s+1)/2求出该斜线最小值,如36

 

mat[i][j] = squa - s * (s + 1) / 2 - (mat_size - ((( i + j) % 2) ? i : j));  

 

我们求出的这个36后怎么和55有什么关系呢

 

squa=N*N

 

为总数,然后我们利用总数减去对称斜线最小数求出我们这行斜线最大数

 

就像100减去36,我们得出64就是55所在斜线最大值,然后再利用距离最大值的位置(mat_size - ((( i + j) % 2) ? i : j))得出该值

 

 

 

其实我比较想知道这个zigzag数组是什么,有什么用。。。为什么jpeg编码要这样呢

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐