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编码要这样呢