对面试题“输入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编码要这样呢
{
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编码要这样呢
相关文章推荐
- 面试例题:输入n,求一个n x n矩阵,规定矩阵沿45度递增,形成一个zigzag数组(JPEG编码里取像素数据的排列顺序),请问如何用C++实现? (中国台湾著名硬件公司2007年11月面试题)
- zigzag数组:输入n,求一个nXn矩阵,规定矩阵沿45度递增,形成一个zigzag数组
- zigzag数组:输入n,求一个nXn矩阵,规定矩阵沿45度递增,形成一个zigzag数组
- 输入n,求一个n×n矩阵,规定矩阵沿45度递增,形成zigzag数组
- 形成一个zigzag数组(JPEG编码里取像素数据的排列顺序)
- zigzag数组,输入n,求一个n x n矩阵,规定矩阵沿45度线递增,形成一个zigzag数组
- 用c++实现一个n*n矩阵,矩阵沿着45度递增,形成zigzag数组
- (PHP实现剑指offer)在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
- 【c语言】二维数组中的查找,杨氏矩阵在一个二维数组中,每行都依照从左到右的递增的顺序排序,输入这种一个数组和一个数,推断数组中是否包括这个数
- 在一个二维数组中,每一行都按照从左到右递增的顺序排列,每一列都按照从上到下递增的顺序排列,请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
- 在一个二维数组中,每一行都按照从左到右递增的顺序排列,每一列都按照从上到下递增的顺序排列,请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
- 在一个二维数组中,每一行都按照从左到右递增的顺序排列,每一列都按照从上到下递增的顺序排列,请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
- PHP实现在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
- 在一个二维数组中,每一行都按照从左到右递增的顺序排列,每一列都按照从上到下递增的顺序排列,请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
- 在一个二维数组中,每一行都按照从左到右递增的顺序排列,每一列都按照从上到下递增的顺序排列,请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
- 【算法】 输入n 输出一个n*n的zigzag矩阵 利用c++实现
- OJ 如何实现一个按输入顺序排列的映射?
- 在一个二维数组中,每一行都按照从左到右递增的顺序排列,每一列都按照从上到下递增的顺序排列,请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
- 在一个二维数组中,每一行都按照从左到右递增的顺序排列,每一列都按照从上到下递增的顺序排列,请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
- 【c语言】二维数组中的查找,杨氏矩阵在一个二维数组中,每行都按照从左到右的递增的顺序排序,输入这样的一个数组和一个数,判断数组中是否包含这个数