java趣味编程案例一:回形矩阵的实现

xiaoxiao2021-02-28  36

问题描述: 1 2 3 4 12 13 14 5 11 16 15 6 10 9 8 7 根据输入不同的矩阵行或列,实现上述矩阵。

问题分析:

矩阵从第一行第一个值开始向右依次递增,直到到达矩阵的右边界,方向向下,以此类推,整个矩阵值的递增是顺时针方向的。

矩阵的实现关键是要判断方向何时变化。假设矩阵初始值都为0。比如说矩阵向左递增,当矩阵到达最左端或者最左端的值不为0时,矩阵方向就要向上拐。所以我们就要列举出上,下,左,右四种不同的方向改变的情况。

最后我们利用双重循环打印出数组。(因为是矩阵,所以用二维数组存储)

代码分析

接下来是对每部分代码的解析。 1. 首先定义二维数组,但不进行初始化。后面根据输入设置大小之后再进行赋值。 2. 以枚举的方式列举出四个方向,这样方便后面操作。并且设置初始方向为右方向。

static int[][] matrix; static int values=1; static enum Direction{ Right,Left,Up,Down; } static Direction lastDirection=Direction.Right;//初始方向

3.接下来是判断方向改变的不同情况,返回值是接下来的方向

public static Direction findDirection(int row,int col){ Direction direction=lastDirection; switch (direction){ case Right: //如果到达右边界或者下一个值不为0(说明已经赋值),则转变方向向下 if((col==matrix.length-1)||(matrix[row][col+1])!=0){ direction=Direction.Down; } break; case Down: //如果到达下边界或者下方已经填充数字,则左拐 if((row==matrix.length-1)||(matrix[row+1][col]!=0)){ direction=Direction.Left; } break; case Left: //如果列为0(说明到达最左边)或左方已经填充过数字,则上拐 if((col==0)||(matrix[row][col-1]!=0)){ direction=Direction.Up; } break; case Up: //如果上方已经填充则右拐(不需要判断最上方有没有值,因为一开始就是从最上方开始赋值) if(matrix[row-1][col]!=0){ direction=Direction.Right; } break; } return direction;//返回值为最终的方向 }

4.将数字填充在数组中,根据上面得到的方向来确定下标的值

public static void init(int n){ matrix=new int[n][n]; int row=0,col=0; for(int i=0;i<matrix.length*matrix.length;i++){ matrix[row][col]=values;//第一个值为1 lastDirection=findDirection(row,col);//确定方向 switch (lastDirection){ case Up: //向上转则行数减一 row--; break; case Down: row++; break; case Right: col++; break; case Left: col--; break; default: System.out.println("error"); } values++;//填充之后值加一,进行下一个位置的填充 } }

5.打印数组

public static void print(int[][] arr){ for(int i=0;i<matrix.length;i++){ for(int j=0;j<matrix.length;j++){ System.out.printf(" -",matrix[i][j]); } System.out.println(); } }

6.main函数

public static void main(String[] args) { System.out.println("请输入矩阵的行或列数"); Scanner scanner=new Scanner(System.in); int n=scanner.nextInt(); init(n); print(matrix); }

7.测试结果 输入9得:

请输入矩阵的行或列数 9 1 2 3 4 5 6 7 8 9 32 33 34 35 36 37 38 39 10 31 56 57 58 59 60 61 40 11 30 55 72 73 74 75 62 41 12 29 54 71 80 81 76 63 42 13 28 53 70 79 78 77 64 43 14 27 52 69 68 67 66 65 44 15 26 51 50 49 48 47 46 45 16 25 24 23 22 21 20 19 18 17

完整代码

import java.util.Scanner; public class _1BackShapeMatrix { static int[][] matrix; static int values=1; static enum Direction{ Right,Left,Up,Down; } static Direction lastDirection=Direction.Right; public static Direction findDirection(int row,int col){ Direction direction=lastDirection; switch (direction){ case Right: if((col==matrix.length-1)||(matrix[row][col+1])!=0){ direction=Direction.Down; } break; case Down: if((row==matrix.length-1)||(matrix[row+1][col]!=0)){ direction=Direction.Left; } break; case Left: if((col==0)||(matrix[row][col-1]!=0)){ direction=Direction.Up; } break; case Up: if(matrix[row-1][col]!=0){ direction=Direction.Right; } break; } return direction; } public static void init(int n){ matrix=new int[n][n]; int row=0,col=0; for(int i=0;i<matrix.length*matrix.length;i++){ matrix[row][col]=values; lastDirection=findDirection(row,col); switch (lastDirection){ case Up: row--; break; case Down: row++; break; case Right: col++; break; case Left: col--; break; default: System.out.println("error"); } values++; } } public static void print(int[][] arr){ for(int i=0;i<matrix.length;i++){ for(int j=0;j<matrix.length;j++){ System.out.printf(" -",matrix[i][j]); } System.out.println(); } } public static void main(String[] args) { System.out.println("请输入矩阵的行或列数"); Scanner scanner=new Scanner(System.in); int n=scanner.nextInt(); init(n); print(matrix); } }
转载请注明原文地址: https://www.6miu.com/read-2620478.html

最新回复(0)