Java回形矩阵(数组元素赋值问题)

问题:java

从键盘读入一个数,打印出如下特色的矩阵。

如输入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数组

显然,该问题应用数组来存储数据,因此重点是找出赋值的规律。从问题中可以看出,矩阵是按顺时针顺序,从外圈到内圈,由1到n逐个赋值,且每行(列)都为n个数。code

想法

以一个6*6的回行矩阵为例,将每一个数视为一个点,按照顺序依次链接,获得一个“回行迷宫”。按照其规律,咱们就是要沿着迷宫墙壁(即图示连线)走,每走一步,赋一个值,走到必定步数后就90°转向换个方向继续走。blog

回行矩阵示例图-1

Question:

那么,要走多少步呢?这个步长是否也有规律可循?还有,转向时的方向该如何判断?...input

仔细揣摩,发现矩阵走完每一面墙壁的步长依次是五、五、五、四、四、三、三、二、二、一、1,走完一个步长即转向,且只有上、下、左、右四个方向。it

若抛开第一面墙壁,则剩余的墙壁中,每两个墙壁具备相同的长度,且互相垂直,同时每走完两面墙壁,步长减1。故考虑第一面墙壁单独处理,剩余墙壁按相同规则处理。io

回行矩阵示例图-2

试着链接副对角线上的数,则可获得5个从大到小、以虚线为底边的等腰直角三角形(暂且无论第一行),且5个等腰直角三角形的腰长依次为五、四、三、二、1 (接下来咱们就以一个三角形为基准来执行操做)。class

先将第一行单独赋值,而后就是走出5个等腰直角三角形。变量

站在小人位置,第一个三角形腰长为5(初始方向向下),接着每走完一个腰长就90°转向,每走完两个腰长(即走出一个等腰直角三角形),将腰长-1。循环

转向周期为4,按照向下、向左、向上、向右的顺序,以此往复。

回行矩阵示例图-3

总结

  • 对于一个n*n的回行矩阵,将其每一个数视为一个点,按赋值顺序依次链接起来;
  • 链接副对角线上的点,则可获得 n-1 个等腰直角三角形以及额外的一条直线 (即第一行); 这 n-1 个等腰直角三角形的腰长逐个递减1;
  • 第一行单独赋值。走三角形时的初始方向向下,步长为 n-1 ,走完一个步长转向,走完两个步长除了转向还要将步长减1
  • 循环条件为while(a[i][j] != n*n) ,方向用四个数字表示,可经过方向变量的值来控制方向变化。

代码实现

public class NumberOfRounds {
    private static final int DOWN = 0;	//向下
    private static final int LEFT = 1;	//向左
    private static final int UP = 2;   	//向上
    private static final int RIGHT = 3;  //向右
   
    public static void main(String [] args) {		
	Scanner sc = new Scanner(System.in);
	System.out.println("Please input num:");
	int n;
	n = sc.nextInt();
	int[][] roundsNum = new int[n][n];
		
	int number=1;		
	int i=0,j=0;		
	//先单独处理第一行
	while(i==0&&j<n) {
		roundsNum[i][j] = number++;
		j++;
	}
	j--;
		
	int direction = 0; 
	int step = n-1;
	int currentStep=0;
		
	while(roundsNum[i][j]!=n*n) {
		switch(direction%4){
		case DOWN: 
			i++;								
			break;
		case LEFT:	
			j--;
			break;
		case UP:	
			i--;
			break;
		case RIGHT:	
			j++;
			break;							
		}
			
		roundsNum[i][j] = number++;
		currentStep++;
			
		if(currentStep % step == 0) {
			direction++;
			//走完一个等腰三角形,则将当前已走步数清0,并将步长减1
			if(currentStep == step*2) {	
				step--;
				currentStep=0;
			}
		}
			
	}
		
				
		
    }
}
相关文章
相关标签/搜索