欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

打印回形数组

程序员文章站 2022-03-06 11:05:51
...

前段时间面试的时候被问到打印回形数组,当时只写了个大概,后来网上看了下,也实现得麻烦,就重新写了下,
题目:输入一个整数N,打印出从1~N*N的N*N矩阵。 
比如N = 3,构成矩阵: 
1,2,3,
8,9,4,
7,6,5,

比如N = 4,构成矩阵: 
 1, 2, 3, 4,
12,13,14, 5,
11,16,15, 6,
10, 9, 8, 7,


N=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,


对于输入的整数,安行输出回形矩阵。 

思路就是按照回形数组的规则,第一行先向右存放数组,然后折行向下,然后向左,最后向上,形成回形。

只用循环一次就可以了(看了几篇文章,用了几层循环,较麻烦)

枚举类,用来代表“上下左右”四个方向

  public enum DirectionEnum{
    RIGHT(1,"向右"),
    DOWN(2,"向下"),
    LEFT(3,"向左"),
    UP(0,"向上");

    public int getCode() {
      return code;
    }

    public void setCode(int code) {
      this.code = code;
    }

    public String getDescription() {
      return description;
    }

    public void setDescription(String description) {
      this.description = description;
    }

    DirectionEnum(int code, String description) {
      this.code = code;
      this.description = description;
    }

    private int code;

    private String description;

    public static DirectionEnum getDirectionByCode(int code){
      for (DirectionEnum directionEnum : DirectionEnum.values()) {
        if (directionEnum.getCode() == code) {
          return directionEnum;
        }
      }
      return null;
    }
  }

 算法实现

  private int[][] algorithm(int n){
    int length=n*n;
    int [][]result=new int[n][n];
    int direction=1;
    int i=0,j=0;
    for (int k=1;k<=length;k++){
      result[i][j]=k;
      DirectionEnum directionEnum=DirectionEnum.getDirectionByCode(direction%4);
      switch (directionEnum){
        case RIGHT:{
          if (j==n-1||result[i][j+1] != 0){
            i++;
            direction++;//改变方向
          }else{
            j++;
          }
        }break;
        case DOWN:{
          if (i==n-1||result[i+1][j]!=0){
            j--;
            direction++;//改变方向
          }else{
            i++;
          }
        }break;
        case LEFT:{
          if (j==0||result[i][j-1]!=0){
            i--;
            direction++;//改变方向
          }else{
            j--;
          }
        }break;
        case UP:{
          if (i==0||result[i-1][j]!=0){
            j++;
            direction++;//改变方向
          }else{
            i--;
          }
        }break;
        default:
      }
    }
    return result;
  }

算法调用及打印输出

  public void dotest(){
    int n=11;
    int maxNumLength=String.valueOf(n*n).length();
    int [][] result=algorithm(n);
    //格式化打印输出
    for ( int i=0;i<result.length;i++){
      for(int j=0;j<result[i].length;j++){
        System.out.print(String.format("%"+maxNumLength+"d",result[i][j])+",");
      }
      System.out.println();
    }
  }

运行结果如下图:

打印回形数组