美文网首页
Java 实现输出螺旋矩阵

Java 实现输出螺旋矩阵

作者: 南北VS东西 | 来源:发表于2018-08-29 16:11 被阅读0次
题目 好记性不如烂笔头,记下来
  • 用java实现输入一个50以内的数字num,让这个num的平方数字以螺旋矩阵的方式显示在屏幕上。


    TIM截图20180829160501.png
  • 图解示例:(如下图↓)

    20160709135942624.png
  • 上 代码

public class SpiralMatrix {

    public static void main(String[] args) {
        int n = 5;
        SpiralMatrix s = new SpiralMatrix();
        int[][] data = s.createMatrix(n);
        int wei = calwei(n * n);
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < n; j++) {
                int temp = calwei(data[i][j]);
                for (int k = 0; k < wei - temp; k++) {
                    System.out.print(" ");
                }
                System.out.print(data[i][j] + " ");
            }
            System.out.println();
        }
    }

    public int[][] createMatrix(int n) {
        // n*n的二维数组,初始元素值都为0
        int[][] matrix = new int[n][n];
        // 分别表示右下左上四个方向
        int right = 1, down = 2, left = 3, up = 4;
        int direction = right;
        // n阶矩阵,共有n×n个数
        int numb = n * n;
        int i = 0, j = 0;
        for (int p = 1; p <= numb; p++) {
            matrix[i][j] = p;
            // 判断方向向右的情况
            if (direction == right) {
                // 如果当前位置的右面位置在右边界内且值还是初始值,则行不变,列号向右移动一位
                if (j + 1 < n && matrix[i][j + 1] == 0) {
                    j++;
                } else {
                    // 如果超出右边边界,或者右面的元素已经被修改过,则向下移动一行,且将方向改为向下
                    i++;
                    direction = down;
                    continue;
                }

            }
            // 判断方向向下的情况
            if (direction == down) {
                // 如果当前位置的下面位置在下边界内且值还是初始值,则列不变,行号向下移动一位
                if (i + 1 < n && matrix[i + 1][j] == 0) {
                    i++;
                } else {
                    // 如果超出下边界,或者下面的元素已经被修改过,则向左移动一行,且将方向改为向左
                    j--;
                    direction = left;
                    continue;
                }
            }
            // 判断方向向左的情况
            if (direction == left) {
                // 如果当前位置的左面位置在左边界内且值还是初始值,则行不变,列号向左移动一位
                if (j - 1 >= 0 && matrix[i][j - 1] == 0) {
                    j--;
                } else {
                    // 如果超出左边界,或者左面的元素已经被修改过,则向上移动一行,且将方向改为向上
                    i--;
                    direction = up;
                    continue;
                }
            }
            // 判断方向向上的情况
            if (direction == up) {
                // 如果当前位置的上面位置在上边界内且值还是初始值,则列不变,行号向左移动一位
                if (i - 1 >= 0 && matrix[i - 1][j] == 0) {
                    i--;
                } else {
                    // 如果超出上边界,或者上面的元素已经被修改过,则向右移动一列,且将方向改为向右
                    j++;
                    direction = right;
                    continue;
                }
            }

        }
        return matrix;

    }

    // 为了将矩阵补齐,看起来好看一些
    public static int calwei(int num) {
        if (num / 10 < 1) {
            return 1;
        }
        if (num / 100 < 1) {
            return 2;
        }
        if (num / 1000 < 1) {
            return 3;
        }
        if (num / 10000 < 1) {
            return 4;
        }
        if (num / 100000 < 1) {
            return 5;
        }
        if (num / 10000000 < 1) {
            return 6;
        }
        if (num / 100000000 < 1) {
            return 7;
        } else {
            return 0;
        }

    }

}
  • 另外一种实现方案
public class printcircle {
 
    public static void main(String[] args) {
    int n=3;
    
    int sum=n*n;
    int wei=calwei(sum);
    int A[][]=new int[n][n];
    A[0][0]=1;
    
    //算左上至右下的对角线的值
    for(int i=0;i<n/2;i++){
       A[i+1][i+1]=A[i][i]+4*(n-2*i-1);
    }   
    
    //计算每行上面横向的值
    for(int i=0;i<n;i++){
        for(int j=i+1;j<n-i;j++){
            A[i][j]=A[i][j-1]+1;
        }
    }   
    
    
    //计算每列右边竖向的值
    for(int i=n-1;i>=0;i--){
        for(int j=n-i-1;j<i;j++){
            A[j+1][i]=A[j][i]+1;
        }
    }   
    
    
    //计算每行下面横向的值
    for(int i=n-1;i>n/2;i--){
        for(int j=i;j>n-i-1;j--){
            A[i][j-1]=A[i][j]+1;
        }
    }
    
    //计算每列左边竖向的值
    for(int i=0;i<n/2;i++){
        for(int j=n-1-i;j>i+1;j--){
            A[j-1][i]=A[j][i]+1;
        }
    }
    
    
    //处理输入的值为偶数的情况  
    if(n%2==0){
        A[n/2][n/2-1]=sum;
    }
    
    for(int i=0;i<n;i++){
        for(int j=0;j<n;j++){
            int temp=calwei(A[i][j]);
            for(int k=0;k<wei-temp;k++){
                System.out.print(" ");
            }
            System.out.print(A[i][j]+" ");
        }   
        for(int s=0;s<wei-1;s++){
            System.out.println();
        }
        }
    }
    
    //为了将矩阵补齐,看起来好看一些
    public static int calwei(int num){
        int wei=1;
        if(num/10<1) return 1;
        if(num/100<1) return 2;
        if(num/1000<1) return 3;
        if(num/10000<1) return 4;
        if(num/100000<1) return 5;
        if(num/10000000<1) return 6;
        if(num/100000000<1) return 7;
        else return 0;
        
    }
 
}

相关文章

  • Java 实现输出螺旋矩阵

    题目 好记性不如烂笔头,记下来 用java实现输入一个50以内的数字num,让这个num的平方数字以螺旋矩阵的方式...

  • 螺旋输出矩阵

    给定一个mmm行、nnn列的矩阵,按照顺时针螺旋的顺序输出矩阵中所有的元素(从[0][0]位置开始,具体请参见下图...

  • 54. Spiral Matrix

    题目分析 螺旋打印矩阵。暴力实现~ 代码

  • Java 实现螺旋矩阵的方法

    今天和朋友聊起看到一个螺旋数组,困扰了他很久。本人也试了试看似挺简单的啊 后面一试还是花了些时间。现在分享一下我...

  • Java(简单例子学习2)

    螺旋矩阵 import java.util.Scanner; public class oop01 { publi...

  • Python实现螺旋矩阵

    螺旋矩阵 什么是螺旋矩阵? 螺旋矩阵是指一个呈螺旋状的矩阵,它的数字由第一行开始到右边不断变大,向下变大,向左变大...

  • JS实现螺旋矩阵

      螺旋矩阵是指一个呈螺旋状的矩阵,它的数字由第一行开始到右边不断变大,向下变大,向左变大,向上变大,如此循环,接...

  • (python实现)螺旋矩阵

    问题描述 给定一个大小的矩阵行,列),按螺旋的顺序返回矩阵中的所有元素。数据范围:,矩阵中任意元素都满足 示例1 ...

  • C语言 矩阵螺旋输出 解法

    C语言算法题 给定一个 m行、n列的矩阵,请按照顺时针螺旋的顺序输出矩阵中所有的元素(从[0][0]位置开始,具体...

  • Java for 螺旋矩阵和蛇型矩阵

    螺旋矩阵和蛇型矩阵,是两个比较有趣的矩阵问题,这两个问题的答案也有许多种,简单问一下Baidu,就各自有N种实现,...

网友评论

      本文标题:Java 实现输出螺旋矩阵

      本文链接:https://www.haomeiwen.com/subject/aakkwftx.html