把1,2,3…n*n 的数字按照顺时针螺旋的形式填入数字矩阵
从键盘输入一个整数(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 的数字按照顺时针螺旋的形式填入数字矩阵的更多相关文章
- JS数字金额转换为货币汉字形式
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"% ...
- python中 将数字转化为人民币的形式
def fn(args): """ 将金额转化为人民币模式,带逗号分隔,保留小数点两位,四舍五入 :param args: :return: ""&q ...
- C算法编程题(二)正螺旋
前言 上一篇<C算法编程题(一)扑克牌发牌> 写东西前总是喜欢吐槽一些东西,还是多啰嗦几句吧,早上看了一篇博文<谈谈外企涨工资那些事>,里面楼主讲到外企公司包含的五类人,其实不 ...
- java实现顺时针螺旋填入
从键盘输入一个整数(1~20) 则以该数字为矩阵的大小,把 1,2,3-n*n 的数字按照顺时针螺旋的形式填入其中.例如: 输入数字 2,则程序输出: 1 2 4 3 输入数字 3,则程序输出: 1 ...
- PAT - IO - 螺旋方阵
所谓“螺旋方阵”,是指对任意给定的N,将1到N*N的数字从左上角第1个格子开始,按顺时针螺旋方向顺序填入NxN的方阵里.本题要求构造这样的螺旋方阵. 输入格式: 输入在一行中给出一个正整数N(< ...
- PTA 螺旋方阵
所谓"螺旋方阵",是指对任意给定的NNN,将1到N×NN\times NN×N的数字从左上角第1个格子开始,按顺时针螺旋方向顺序填入N×NN\times NN×N的方阵里.本题要求 ...
- C语言博客作业4——数组
0.展示PTA总分 一维数组 二维数组 字符数组 1.本章学习总结 1.1学习内容总结 一维数组知识点: 无论是对一维数组还是二维数组进行应用时,我们对其下标的应用十分广泛. 1:一维数组的输入和遍历 ...
- LeetCode Spiral Matrix II (技巧)
题意: 从1开始产生连续的n2个数字,以螺旋的方式填满一个n*n的数组. 思路: 由于是填满一个矩阵,那么只需要每次都填一圈即可.应该注意特殊情况. 迭代: class Solution { publ ...
- 1990-D. 幻方
描述 河图,黑点白点排列奥秘数阵:洛书,纵横斜三条线上数和皆15.这是一个古老的数字游戏,将1~9填入一个九宫格,使得每行.每列.对角线上数字的和都相同(为15).在西方,满足类似规律的矩阵称之为幻方 ...
随机推荐
- ACM-ICPC 2018 沈阳赛区网络预赛-D:Made In Heaven(K短路+A*模板)
Made In Heaven One day in the jail, F·F invites Jolyne Kujo (JOJO in brief) to play tennis with her. ...
- 《DSP using MATLAB》Problem 5.19
代码: function [X1k, X2k] = real2dft(x1, x2, N) %% --------------------------------------------------- ...
- debian 配置linuxptp 软件时间戳
编程之路刚刚开始,错误难免,希望大家能够指出. ntp,ptp,ntp,ptp 本文只说软件时间戳 先上几个推荐的网址,可以更好的了解ptp: https://docs.fedoraproject.o ...
- python与系统做交互常用的模块和使用方法
1.使用os模块与系统做简单命令的交互 >>>import os >>>os.popen('pwd') <open file 'pwd', mode 'r' ...
- 【java规则引擎】《Drools7.0.0.Final规则引擎教程》第4章 4.5RHS语法
转载至:https://blog.csdn.net/wo541075754/article/details/76651073 RHS语法 使用说明 RHS是满足LHS条件之后进行后续处理部分的统称,该 ...
- 转载 React.createClass 对决 extends React.Component
先给出结论,这其实是殊途同归的两种方式.过去我们一般都会使用 React.createClass 方法来创建组件,但基于 ES6 的小小语法糖,我们还可以通过 extends React.Compon ...
- Mybatis一(基础)
mybatis架构 1.mybatis配置 SqlMapConfig.xml,此文件作为mybatis的全局配置文件,配置了mybatis的运行环境等信息. mapper.xml文件即sql映射文件, ...
- Java基础七(Eclipse工具)
今日内容介绍1.Eclipse开发工具2.超市库存管理系统 ###01Eclipse的下载安装 * A: Eclipse的下载安装 * a: 下载 * http://www.eclipse.org ...
- IntelliJ IDEA 快捷键说明大全(中英对照、带图示详解)
因为觉得网络上的 idea 快捷键不够详尽,所以特别编写了此篇文章,方便大家使用 idea O(∩_∩)O~ 其中的英文说明来自于 idea 的官网资料,中文说明主要来自于自己的领会和理解,英文说明只 ...
- sofa graphql 2 rest api 试用
大部分代码还是来自sofa 的官方文档,同时添加了docker && docker-compose集成 备注: 代码使用typescript 同时运行的时候为了方便直接运行使用ts ...