蛇形填数
时间限制:3000 ms | 内存限制:65535 KB
难度:3
输入
直接输入方阵的维数,即n的值。(n<=100)
输出
输出结果是蛇形方阵。
样例输入
3
样例输出
7 8 1
6 9 2
5 4 3
描述
在n*n方阵里填入1,2,...,n*n,要求填成蛇形。例如n=4时方阵为:
10 11 12 1
9 16 13 2
8 15 14 3
7 6 5 4
个人解答:
先来分析一下怎么构造数组。(以n=5的方阵为例)。
n=5的方阵的横纵坐标如图所示:
n=5的方阵的数据如图所示:
此处采用的构造方法:先1~5,再6~9,然后10~13,最后14~16,视为一层,也就是程序中的t=1, 为第一层循环。然后第二层循环,此时t=2:17~19,20~21,22~23,24。最后一层循环,t=3, 只有一个25。
import java.util.Scanner;
public class Main {
public static void out(int a[][], int n) {
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
System.out.print(a[i][j] + " ");
}
System.out.println();
}
}
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
int n = input.nextInt();
input.close();
int a[][] = new int[n + 1][n + 1];
int i, j, temp = 0;
for (int t = 1; ; t++) {
for (i = t; i <= n-t+1 && temp < n*n; i++) { //从上到下
a[i][n-t+1] = ++temp;
}
for (j = n - t; j >= t && temp < n*n; j--) { //从右到左
a[n-t+1][j] = ++temp;
}
for (i = n - t; i >= t && temp < n*n; i--) { //从下到上
a[i][t] = ++temp;
}
for (j = t+1; j <= n - t && temp < n*n; j++) { //从左到右
a[t][j] = ++temp;
}
if (temp >= n*n) {
out(a,n);
break;
}
}
}
}
分析下程序:
内层的四个循环分别表示数据的构造顺序以及方向,temp表示数组当前位置的值。由于数组可能在任一条路构造后数据填完,因此在四个循环中都要添加temp<=n*n的判断。
ps: 附带几个提升运行速度的方法:
1. scanner的关闭,越早越好。
2. 采用静态方法输出最终结果(不明白/(ㄒoㄒ)/~~)
3. 能放在循环外面定义的变量就不要放在循环里面(以后循环内就不用定义变量了。。前提:只为速度)
运行结果:
求优化。