您的位置:首页 > 编程语言 > Java开发

NYOJ-33 蛇形填数

2017-03-18 00:00 232 查看
摘要: 原题链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=33

蛇形填数

时间限制: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. 能放在循环外面定义的变量就不要放在循环里面(以后循环内就不用定义变量了。。前提:只为速度)

运行结果:



求优化。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Java OJ 蛇形填数