试题编号: 201412-2
试题名称: Z字形扫描
时间限制: 2.0s
内存限制: 256.0MB
图片指引:
思路:
经过反复的看图、商讨,我们发现了这样一个规律,遍历的时候,都是按照顺序2-3-4-1-2-3-4···遍历,每遍历一个数,就把那个数置0。
2和4都只走一步,如果跳完发现当前顺序无法遍历,那就跳回去,然后继续到下一个顺序,直到遍历到数组 a[n-1][n-1] 的时候,遍历完毕,退出程序。
1和3的时候,遍历的时候除了要判断是否到边界问题,还得判断是否遇到0,如果遇到了0,那就说明这条线我们刚刚遍历过了,所以我们得返回去,然后接着下一个顺序的判断。
代码如下:
import java.util.Scanner;
public class Main {
public static int i = 0, j = 0;
//为了方便遍历,我们定义两个常量
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
int n = input.nextInt();
int[][] a = new int[n][n];
for (int x = 0; x < n; x++) {
for (int y = 0; y < n; y++) {
a[x][y] = input.nextInt();
//输入矩阵数组。
}
}
System.out.printf("%d ", a[0][0]);
//打印第一个,然后判断n是否大于1,决定于是否需要遍历。
// 没有这个判断 只能拿80分。
if (n > 1) {
no2(a);
}
}
public static void no1(int[][] a) {
i--;
j++;
while (i >= 0 && j < a[0].length) { // 判断是否碰壁了。
if (a[i][j] == 0) { //如果为0,说明我们遍历过了,跳出循环
break;
}
System.out.printf("%d ", a[i][j]);
a[i][j] = 0;
// 没遍历一个数,就置0,以便判断是否遍历过了。
i--;
j++;
}
// 打印完,我们需要跳回去。然后执行 no2().
i++;
j--;
no2(a);
}
public static void no2(int[][] a) {
j++;
if (j == a[0].length - 1 && i == a[0].length - 1) {
// 判断是否遍历到了最后一个数,是的话 打印这个数后就终止程序。
System.out.printf("%d", a[i][j]);
System.exit(0);
//终止程序
}
if (j <= a[0].length - 1) {
// 判断是否到达最右边
System.out.printf("%d ", a[i][j]);
a[i][j] = 0;
} else {
// 如果是最右边,则下标退回去。
j--;
}
no3(a);
}
public static void no3(int[][] a) {
i++;
j--;
while (j >= 0 && i < a[0].length) {
if (a[i][j] == 0) {
break;
}
System.out.printf("%d ", a[i][j]);
a[i][j] = 0;
i++;
j--;
}
i--;
j++;
no4(a);
}
public static void no4(int[][] a) {
i++;
if (i <= a[0].length - 1) {
System.out.printf("%d ", a[i][j]);
a[i][j] = 0;
} else {
i--;
}
no1(a);
}
}