背景
Z字形编排过程大致是这样的:经过前期处理的图像被分为若干个 的小图像块,此时就从小图像块的左上角开始沿Z字形对图像元素进行遍历,并将遍历所得的结果重新写入等大小的图像块中
经过Z自行排列之后,原图像矩阵中的序号变为如下图所示:
总结规律
对于原始矩阵matrix中的任意元素matrix[i][j]的遍历走向规律可以分为如下三种情况(偶数情况下)
1、如果二维数组中的元素matrix[i][j]中纵坐标j是偶数,且i=0或者i=7,那么遍历路径在矩阵中的走向就是水平向右移动一格。
2、如果二维数组中的元素matrix[i][j]中横坐标i是奇数,且j=0或者j=7,,那么遍历路径在矩阵中的走向就是垂直向下移动一格。
3、除上述规则以外的情况,如果二维数组中的元素matrix[i][j]的横纵坐标和i+j是偶数,则遍历路径在矩阵中的走向就是右上角移动一格;否则,若i+j是奇数,则遍历路径在矩阵中的走向就是左下角移动一格。
当然也需要对奇数情况进行分析,过程和偶数过程一样;
Java代码实现
import java.util.Scanner;
/**
* Z字行编排问题
* 算法之美P48
* Created by xuliugen on 2016/8/18.
*/
public class ZZiBianPai {
public static int SIZE = 8; //Z字形编排的大小
public static void main(String[] args) {
int[][] array = initArray();
printArray(array);
array = getZLayout(array);
printArray(array);
}
private static int[][] getZLayout(int[][] array) {
int[][] result = new int[SIZE][SIZE];
int i = 0, j = 0;
for (int x = 0; x < SIZE; x++) {
for (int y = 0; y < SIZE; y++) {
result[i][j] = array[x][y]; //把原数组中指定位置的数组放置在result数组的位置上
if (SIZE % 2 == 1) { //SIZE为奇数
if ((i == 0 && j % 2 == 0 && j != SIZE - 1) || (i == SIZE - 1 && j % 2 == 1)) {
j++;
continue;
}
if ((j == 0 && i % 2 == 1) || (j == SIZE - 1 && i % 2 == 0)) {
i++;
continue;
}
if ((i + j) % 2 == 0) { //向右上角移动
i--;
j++;
} else if ((i + j) % 2 == 1) {//向左下角移动
i++;
j--;
}
} else { //SIZE为偶数
if ((i == SIZE - 1 || i == 0) && j % 2 == 0) { //纵坐标为偶数,且i=0或者i=7,遍历水平向右移动一格
j++;
continue;
}
if ((j == SIZE - 1 || j == 0) && i % 2 == 1) {//横坐标为奇数,且j=0或者j=7,遍历垂直向下移动一格
i++;
continue;
}
if ((i + j) % 2 == 0) { //向右上角移动
i--;
j++;
} else if ((i + j) % 2 == 1) {//向左下角移动
i++;
j--;
}
}
}
}
return result;
}
/**
* 打印出来初始化的数组,检测输入结果
*/
private static void printArray(int[][] array) {
System.out.println();
for (int i = 0; i < SIZE; i++) {
for (int j = 0; j < SIZE; j++) {
System.out.printf(array[i][j] + "\t");
}
System.out.println();
}
}
/**
* 初始化二维数组
*/
private static int[][] initArray() {
System.out.print("请输入二维数组的长度:");
Scanner input = new Scanner(System.in);
SIZE = input.nextInt();
int[][] array = new int[SIZE][SIZE];
System.out.print("请输入二维数组中的元素:");
for (int i = 0; i < SIZE; i++) {
for (int j = 0; j < SIZE; j++) {
array[i][j] = input.nextInt();
}
}
input.close();
return array;
}
}
执行结果
偶数情况:
奇数情况: