NYOJ-33 蛇形填数
2017-03-18 00:00
232 查看
摘要: 原题链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=33
难度:3
输入
直接输入方阵的维数,即n的值。(n<=100)
输出
输出结果是蛇形方阵。
样例输入
样例输出
描述
在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。
分析下程序:
内层的四个循环分别表示数据的构造顺序以及方向,temp表示数组当前位置的值。由于数组可能在任一条路构造后数据填完,因此在四个循环中都要添加temp<=n*n的判断。
ps: 附带几个提升运行速度的方法:
1. scanner的关闭,越早越好。
2. 采用静态方法输出最终结果(不明白/(ㄒoㄒ)/~~)
3. 能放在循环外面定义的变量就不要放在循环里面(以后循环内就不用定义变量了。。前提:只为速度)
运行结果:
求优化。
蛇形填数
时间限制: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. 能放在循环外面定义的变量就不要放在循环里面(以后循环内就不用定义变量了。。前提:只为速度)
运行结果:
求优化。