package com.itheima;
import java.util.Scanner;
public class Test9 {
/** 写一方法,打印等长的二维数组,要求从1开始的自然数由方阵的最外圈向内螺旋方式地顺序排列。 如: n = 4 则打印:
* 1 2 3 4
* 12 13 14 5
* 11 16 15 6
* 10 9 8 7
*/
public static void main(String[] args) {
//获取键盘扫描
Scanner scanner=new Scanner(System.in);
System.out.println("请输入要输出(X*X)的矩阵数字:");
//获取键盘输入的数据
String vuale=scanner.next();
//用于匹配数字字符的表达式
String regex="^[0-9]*$";
if(vuale.matches(regex))
{
//建数字字符转换成数值类型
int len=Integer.valueOf(vuale);
//输出矩阵
ScreenPrint(len);
}else
{
System.out.println("只能输入数字字符");
}
}
/**
* 这一题的解决思路是,记录每一次转弯的点,并更改其数组的行坐标,和列坐标,
* 给数组的赋值顺序是按照,现从右走---->在向下走----->之后向左走----->最后向上走
* 在赋值过程中,记录走过的圈数,因为要更改赋值的走向,以及数组的下标的更改,都需要通过行走的圈数来做出判断
* @param len
*/
public static void ScreenPrint(int len)
{
int row=0;//数组的行下标值
int col=0;//数组的列下标
int right=1;//向右走
int down=2;//向下走
int left=3;//向左走
int up=4;//向上走
int count=1;//数值的累加器
int circle=1;//表示走的第几卷
int number[][]=new int[len][len];
int direct=right;//刚开始默认也是必须得从右开始行走的
while(count<=len*len)
{
number[row][col]=count;
count++;
if(direct==right)
{
//如果数组的列下标小于数组的长度减1,因为数组的下标是从零开始的,所以要减走的圈数
if(col<len-circle)
{
col++;//向右走,行坐标是不变的,列坐标是要递增的
}else
{
direct=down;//将走向转为向下
row++;//因为向下走,数组的行坐标就需要递增一行,也就是转到下一行
}
}else if(direct==down)
{
if(row<len-circle)
{
row++;//向下走,列坐标是不变的,行坐标是要递增的
}else
{
direct=left;//最后一行之后需要把走向转到向左走
col--;//转到上一个数的前列,行坐标是不变的列坐标需要递减的
}
}else if(direct==left)
{
//这里变得判断为什么是圈数减1呢?是如果是第一圈的话,值是不会出错的,第二圈之后就出问题了,他会把之前的数据覆盖的
if(col>circle-1)
{
col--;//向左走,行坐标不变,列坐标需要递减
}else
{
direct=up;//把方向改为向上
row--;//向左,列坐标不变,行坐标需要递减,并且把指向同一列的上一个
}
}else if(direct==up)
{
if(row>circle)
{
row--;//向上走,列坐标不变,行坐标需要递减
}else
{
circle++;//走完一圈之后,增1
direct=right;//方向在从右开始,继续下一圈
col++;
}
}
}
System.out.println("输出结果为:");
//输出数组中的数据
for (int i = 0; i < len; i++) {
for (int j = 0; j <len; j++) {
System.out.print(number[i][j]+"\t");
}
System.out.println();
}
}
}
|