把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).在西方,满足类似规律的矩阵称之为幻方 ...
随机推荐
- ElasticSearch 从零到入门
摘自:https://www.cnblogs.com/keme/p/10108918.html
- IIS 7上导入SSL证书
1.将SSL证书文件上传至服务器 2.导入证书 1)在IIS设置项中,打开‘服务器证书’ 2)选择导入 3)将网站绑定SSL证书
- 20155208 2006-2007-2 《Java程序设计》第1周学习总结
20155208徐子涵 2016-2017-2 <Java程序设计>第1周学习总结 教材学习内容总结 浏览教材 每章提出自己存在的问题 chapter1:JDK和JRE的区别体现在什么地方 ...
- es6的let与es5的var定义变量的区别
es6的let与es5的var定义变量的区别 自身新手第一次接触let关键字的时候,不知道let与var的区别,本能认为是一样,但非如此,比如下述的代码运行就会报错: let hello = 'hel ...
- centos 7 防火墙的使用 firewalld
开启端口命令 输入firewall-cmd --query-port=6379/tcp,如果返回结果为no,那么证明6379端口确实没有开启. 输入firewall-cmd --add-port=63 ...
- linux通过安装包安装nginx和jdk
1.安装prce(重定向支持)和openssl(https支持,如果不需要https可以不安装.) yum -y install pcre* yum -y install openssl* 2.下载n ...
- D. The Fair Nut and the Best Path 树形dp (终于会了)
#include<bits/stdc++.h> #define int long long using namespace std; ; int a[maxn]; int dp[maxn] ...
- test20190409 线段
题意 线段(segment) [题目描述] 给定n条线段,第i条线段的左端点为\(l_i\),右端点为\(r_i\).第i条线段覆盖了点x当且仅当\(l_i ≤x ≤ r_i\). 给定Q个询问,第i ...
- maven(一)
Maven的简介 什么是maven 是apache下的一个开源项目,是纯java开发,并且只是用来管理java项目的 Maven好处 普通的传统项目 maven项目 分析:maven项目为什么这么小? ...
- 关于C# winform怎么调用webapi来获取到json数据
C/S系统也可以和B/S系统一样实现“前后端分离”,那这样写winform就相当于纯粹的前端页面了,然后再单独部署一个webapi项目,通过api调用数据库进行数据的操作,有利于维护和数据安全性的提高 ...