从键盘输入一个整数(1~20)
则以该数字为矩阵的大小,把1,2,3…n*n 的数字按照顺时针螺旋的形式填入其中。例如:
输入数字2,则程序输出:
1 2
4 3
输入数字3,则程序输出:
1 2 3
8 9 4
7 6 5
输入数字4, 则程序输出:
1    2  3   4
12 13 14 5
11 16 15 6
10 9   8  7

代码:

public class FillNumber {
public static void main(String[] args) {
int n = 5;
int[][] arr = getMatrix(n);
show(arr, n); } public static int[][] getMatrix(int n) {
int val = 1; // 从1开始填入数字
int[][] arr = new int[n][n];
int i = 0;
int row, col;
int left, right, top, bottom;
// 循环的圈数
while (i <= (n - 1) / 2) {
row = i;
col = i;
left = row; // 圈的最左端
right = n - 1 - i; // 圈的最右端
top = left; // 圈的顶端
bottom = right; // 圈的底端 // 向右
while (col <= right) {
arr[row][col] = val;
val++;
col++;
}
col = right;
row += 1; // 向下
while (row <= bottom) {
arr[row][col] = val;
val++;
row++;
}
row = bottom;
col -= 1; // 向左
while (col >= left) {
arr[row][col] = val;
val++;
col--;
}
col = left;
row -= 1; // 向上
while (row > top) {
arr[row][col] = val;
val++;
row--;
} i++;
}
return arr;
} public static void show(int[][] arr, int n) {
for (int i = 0; i < n; ++i) {
for (int j = 0; j < n; ++j) {
System.out.printf("%-2d ", arr[i][j]);
}
System.out.println();
}
}
}

改进版:

引入状态变量,用于表示填入数字时的方向。

思路:

1.行坐标不变列坐标递增,当列坐标超出最大范围或者要填充的位置已经被填充过,则跳转到步骤2,
2.行坐标递增列坐标不变,当行坐标超过最大范围或者要填充的位置已经被填充过,则跳转到步骤3
3.行坐标不变列坐标递减,当列坐标小于最小范围或者要填充的位置已经被填充过,则跳转到步骤4
4.行坐标递减列坐标不变,当行坐标小于最小范围或者要填充的位置已经被填充过,则跳转到步骤1
循环执行以上四个步骤,每执行一个步骤则填充一个数据,直到全部数据填充完则结束

    public static int[][] getMatrix1(int n) {
int[][] arr = new int[n][n];
char type = 1;
int val = 1;
int row = 0;
int col = 0;
while (val <= n * n) {
arr[row][col] = val;
val++;
// 根据填入数字的方向 来确定下一个要填入数据的row,col
// 向右
if (type == 1) {
col++;
if (col == n || arr[row][col] != 0) {
col--;
row++;
type = 2;
}
}
// 向下
else if (type == 2) {
row++;
if (row == n || arr[row][col] != 0) {
row--;
col--;
type = 3;
}
}
// 向左
else if (type == 3) {
col--;
if (col == -1 || arr[row][col] != 0) {
col++;
row--;
type = 4;
}
}
// 向上
else if (type == 4) {
row--;
if (row == 0 || arr[row][col] != 0) {
row++;
col++;
type = 1;
}
}
}
return arr;
}

效果:

当n=5时,打印:

1  2  3  4  5
16 17 18 19 6
15 24 25 20 7
14 23 22 21 8
13 12 11 10 9

把1,2,3…n*n 的数字按照顺时针螺旋的形式填入数字矩阵的更多相关文章

  1. JS数字金额转换为货币汉字形式

    <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"% ...

  2. python中 将数字转化为人民币的形式

    def fn(args): """ 将金额转化为人民币模式,带逗号分隔,保留小数点两位,四舍五入 :param args: :return: ""&q ...

  3. C算法编程题(二)正螺旋

    前言 上一篇<C算法编程题(一)扑克牌发牌> 写东西前总是喜欢吐槽一些东西,还是多啰嗦几句吧,早上看了一篇博文<谈谈外企涨工资那些事>,里面楼主讲到外企公司包含的五类人,其实不 ...

  4. java实现顺时针螺旋填入

    从键盘输入一个整数(1~20) 则以该数字为矩阵的大小,把 1,2,3-n*n 的数字按照顺时针螺旋的形式填入其中.例如: 输入数字 2,则程序输出: 1 2 4 3 输入数字 3,则程序输出: 1 ...

  5. PAT - IO - 螺旋方阵

    所谓“螺旋方阵”,是指对任意给定的N,将1到N*N的数字从左上角第1个格子开始,按顺时针螺旋方向顺序填入NxN的方阵里.本题要求构造这样的螺旋方阵. 输入格式: 输入在一行中给出一个正整数N(< ...

  6. PTA 螺旋方阵

    所谓"螺旋方阵",是指对任意给定的NNN,将1到N×NN\times NN×N的数字从左上角第1个格子开始,按顺时针螺旋方向顺序填入N×NN\times NN×N的方阵里.本题要求 ...

  7. C语言博客作业4——数组

    0.展示PTA总分 一维数组 二维数组 字符数组 1.本章学习总结 1.1学习内容总结 一维数组知识点: 无论是对一维数组还是二维数组进行应用时,我们对其下标的应用十分广泛. 1:一维数组的输入和遍历 ...

  8. LeetCode Spiral Matrix II (技巧)

    题意: 从1开始产生连续的n2个数字,以螺旋的方式填满一个n*n的数组. 思路: 由于是填满一个矩阵,那么只需要每次都填一圈即可.应该注意特殊情况. 迭代: class Solution { publ ...

  9. 1990-D. 幻方

    描述 河图,黑点白点排列奥秘数阵:洛书,纵横斜三条线上数和皆15.这是一个古老的数字游戏,将1~9填入一个九宫格,使得每行.每列.对角线上数字的和都相同(为15).在西方,满足类似规律的矩阵称之为幻方 ...

随机推荐

  1. Java依赖注入方式

    pom.xml <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w ...

  2. time,datetime模块

    time & datetime 模块 在平常的代码中,我们常常需要与时间打交道.在Python中,与时间处理有关的模块就包括:time,datetime,calendar(很少用,不讲),下面 ...

  3. 2017-2018-2 20165313实验三 《敏捷开发与XP实践》

    实验报告封面 实验内容及步骤 实验一 1.试验要求: 参考http://www.cnblogs.com/rocedu/p/6371315.html#SECCODESTANDARD安装alibaba 插 ...

  4. hotel管理

    PS:这个界面

  5. pachi 学习

    修改 Makefile DCNN=1 -> DCNN=0 // 禁用DCNN #BOARD_SIZE=19 -> BOARD_SIZE=19 // 棋盘大小19x19 OPT ?= -O3 ...

  6. 深入浅出:MySQL的左连接、右连接、内连接

    http://blog.csdn.net/wyzxg/article/details/7276979 三种连接的语法 为便于更多的技友快速读懂.理解,我们只讨论2张表对象进行连接操作的情况,大于2张表 ...

  7. bfprt

    bfprt //找第k小的数 #include <iostream> #include <vector> #include <algorithm> using na ...

  8. C++ vs Objective C

    oc Short list of some of the major differences: C++ allows multiple inheritance, Objective-C doesn't ...

  9. 2、Sql-oracle创建新用户

    1.首先我们可以用scott用户以sysdba的身份登录oracle. conn scott/tiger as sysdba 2.然后我就可以来创建用户了. create user zs identi ...

  10. Linux(CentOS7.0)下 C访问MySQL (转)

    按语:      最近项目在云服务器上 centos6.8,安装了mysql5.5.39 server和client,但C连接不知所措: 后在官网下载了 devel.share .share-comp ...