实现一个方法,给一个int参数,方法会输出一个矩阵,例如参数5,那么这个矩阵就是5行5列,但是矩阵的规律有要求,如下:
参数如果是1
输出
1
参数如果是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
参数如果是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.矩阵的行数和列数就是我们的参数
例如:参数是3,那么矩阵就是3行3列
2.矩阵中的数字,最大是参数的平方
例如:参数是5,那么矩阵中最大的数字就是25
3.矩阵中的数字的排列是有规律,从1到参数的平方,然后转着圈圈回旋输出
例如:参数是3
1 2 3
8 9 4
7 6 5
4.数字从小到大,输出的模式有四种
4.1 从左往右 → 模式0
4.2 从上往下 ↓ 模式1
4.3 从右往左 ← 模式2
4.4 从下往上 ↑ 模式3
5.数字输出的四种模式之间也有关系
在当前模式下,满足某一个【条件】后,输出的模式就要变化(回旋)
变化的规律:
模式0如果需要转变模式,那么一定是转为模式1
模式1如果需要转变模式,那么一定是转为模式2
模式2如果需要转变模式,那么一定是转为模式3
模式3如果需要转变模式,那么一定是转为模式0
6.我们可以把这个矩阵,想象成在一个二维数组中
例如:这个参数为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
矩阵在二维数组中:
int arr = {
{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}
};
然后可以把这个二维数组想象成这个样子:
0 1 2 3 4
------------------------- Y坐标
0 | 1 2 3 4 5
1 | 16 17 18 19 6
2 | 15 24 25 20 7
3 | 14 23 22 21 8
4 | 13 12 11 10 9
|
X坐标
基于上面第六个点的分析结果,我们需要找出以下几个条件
7.1 如果当前是模式0,那么需要满足什么条件,才会转为模式1
模式0正常情况的条件:
当y坐标不是最大值 && y+1位置的值是0
分析:y不是最大值说明没有到头,y+1位置的值是0,说明下一个位置上还没有赋值,这时候就可以正常执行模式0的逻辑了
模式0正常情况的逻辑特点:
从左往右输出 x坐标不变 y++
转模式的条件:
除了模式正常情况需要的条件之外,其他都是需要转模式的
转模式的时候需要做的操作:
y坐标不变,x++
7.2 如果当前是模式1,那么需要满足什么条件,才会转为模式2
模式1正常情况的条件:
当x坐标不是最大值 && x+1位置的值是0
分析:x不是最大值说明没有到头,x+1位置的值是0,说明下一个位置上还没有赋值,这时候就可以正常执行模式1的逻辑了
模式1正常情况的逻辑特点:
从上往下输出 y坐标不变 x++
转模式的条件:
除了模式正常情况需要的条件之外,其他都是需要转模式的
转模式的时候需要做的操作:
x坐标不变,y–
7.3 如果当前是模式2,那么需要满足什么条件,才会转为模式3
模式2正常情况的条件:
当y坐标不是0 && y-1位置的值是0
分析:y不是0说明没有到头(最左边),y-1位置的值是0,说明下一个位置上还没有赋值,这时候就可以正常执行模式2的逻辑了
模式2正常情况的逻辑特点:
从右往左输出 x坐标不变 y–
转模式的条件:
除了模式正常情况需要的条件之外,其他都是需要转模式的
转模式的时候需要做的操作:
y坐标不变,x–
7.4 如果当前是模式3,那么需要满足什么条件,才会转为模式0
模式3正常情况的条件:
当x坐标不是0 && x-1位置的值是0
分析:x不是0说明没有到头(最上边),x-1位置的值是0,说明下一个位置上还没有赋值,这时候就可以正常执行模式3的逻辑了
模式3正常情况的逻辑特点:
从下往上输出 y坐标不变 x–
转模式的条件:
除了模式正常情况需要的条件之外,其他都是需要转模式的
转模式的时候需要做的操作:
x坐标不变,y++
代码实现:
package com.chenhao.day15;
public class ArrayTest{
public static void main(String[] args){
ArrayTest t=new ArrayTest();
int size=(int)(Math.random()*10);
t.test1(size);
}
//回旋数字
public void test1(int size){
//一个size行size列的矩阵
int[][] arr=new int[size][size];
int maxValue=size*size;
//当前数字输出的模式,分别有0,1,2,3
//0模式 从左到右
//1模式 从上到下
//2模式 从右到左
//3模式 从下到上
int mode=0; //初始为0模式
//矩阵中每个位置的坐标
int x=0;
int y=0;
//构造二维数组,并给每个位置赋值
//变量i从1开始,最大值到maxValue
//[1,maxValue]就是每次在循环中需要放到数组arr中的一个值
//从1到maxValue,把值放完之后,arr数组刚好被放满
int cnt=0;
for(int i=1;i<=maxValue;i++){
//在循环中,我们需要按照相应的规律,找到每个数字应该放在arr数组中的一个合适的位置,然后将其放入
//这里思路是先给位置赋值,然后根据模式判断下一个坐标应该怎么去变化,判断完成后改变坐标(相当于游戏人物在地图中又往前走了一个格子)
//1、赋值
arr[x][y]=i;
//2、根据不同模式判断下一步怎么走
switch(mode){
case 0:{
//正常往前移动
if(y!=size-1&&arr[x][y+1]==0){
y++; //x坐标不变,y++
}
//需要转变模式
else{
mode=1; //将模式改为1
x++; //y不变,x++
}
break;
}
case 1:{
//正常向下移动
if(x!=size-1&&arr[x+1][y]==0){
x++;
}
else{
mode=2;
y--;
}
break;
}
case 2:{
//正常向右移动
if(y!=0&&arr[x][y-1]==0){
y--;
}
else{
mode=3;
x--;
}
break;
}
case 3:{
//正常向上移动
if(x!=0&&arr[x-1][y]==0){
x--;
}
else{
mode=0;
y++;
}
break;
}
}
}
//把构建好的二维数组,进行循环遍历输出
for(int i=0;i<size;i++){
for(int j=0;j<size;j++){
System.out.print(arr[i][j]+"\t"); //输出一行
}
System.out.println(); //换行
}
}
}