在图像编码的算法中,需要将一个给定的方形矩阵进行Z字形扫描(Zigzag Scan)。给定一个n×n的矩阵,Z字形扫描的过程如下图所示:
二维数组扫描后变成一维数组
public static int[] two2one(final int input[][]) {
int n = 0, x = 0, y = 0;
int []output=new int [N*N];
output[n] = input[x][y];
n++;
while (true) {
if (x == 0 && y <= N - 2) {
y++;
output[n] = input[x][y];
n++;
while (true) {
x++;
y--;
output[n] = input[x][y];
n++;
if (y == 0) {
break;
}
}
}
if (y == 0 && x <= N - 2) {
x++;
output[n] = input[x][y];
n++;
while (true) {
x--;
y++;
output[n] = input[x][y];
n++;
if (x == 0) {
break;
}
}
}
if (x == N - 1 && y < N - 2) {
y++;
output[n] = input[x][y];
n++;
while (true) {
x--;
y++;
output[n] = input[x][y];
n++;
if (y == N - 1) {
break;
}
}
}
if (y == N - 1 && x < N - 2) {
x++;
output[n] = input[x][y];
n++;
while (true) {
x++;
y--;
output[n] = input[x][y];
n++;
if (x == N - 1) {
break;
}
}
}
if (x == N - 1 && y == N - 2) {
y++;
output[n] = input[x][y];
break;
}
}// while
return output;
}
扫描后的一维数据还原成二维数组
public static int[][] one2two(final int input[]) {
int n = 0, x = 0, y = 0;
int [][]output=new int [N][N];
output[x][y] = input[n];
n++;
while (true) {
if (x == 0 && y <= N - 2) {
y++;
output[x][y] = input[n];
n++;
while (true) {
x++;
y--;
output[x][y] = input[n];
n++;
if (y == 0) {
break;
}
}
}
if (y == 0 && x <= N - 2) {
x++;
output[x][y] = input[n];
n++;
while (true) {
x--;
y++;
output[x][y] = input[n];
n++;
if (x == 0) {
break;
}
}
}
if (x == N - 1 && y < N - 2) {
y++;
output[x][y] = input[n];
n++;
while (true) {
x--;
y++;
output[x][y] = input[n];
n++;
if (y == N - 1) {
break;
}
}
}
if (y == N - 1 && x < N - 2) {
x++;
output[x][y] = input[n];
n++;
while (true) {
x++;
y--;
output[x][y] = input[n];
n++;
if (x == N - 1) {
break;
}
}
}
if (x == N - 1 && y == N - 2) {
y++;
output[x][y] = input[n];
break;
}
}// while
return output;
}