回旋数字

实现一个方法,给一个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();   //换行
		}
	}
}

发布了39 篇原创文章 · 获赞 0 · 访问量 771

猜你喜欢

转载自blog.csdn.net/qq_37924213/article/details/104774894