打印螺旋矩阵数字

明确了方阵数字是螺旋递增以后,发现每一个“口”字型的一圈数字正好闭合且连续递增。所以解题思路是由“口”字型的

递增依次向内嵌套。先填充最外层“口”字型的一圈数字,接着填充次外层……最后填充最内层的四个数。由一些较简单的画图可以

看出,层数的奇偶会影响到最内层的填充。当为奇数时,最内层只剩一个数字需要填充。所以奇数层需要单独考虑。

先是填充顶部的(n-1)个数字,接着由顶部的最后一个数字开始向下,填充右部的(n-1)个数字,接着是底部的(n-1)个和左部的(n-1)个,这样就填充了最外层的一圈“口”字型数字。(定一个静态的成员变量,从1开始,每填充一次,自增一次),依照同样的方法填充次外层,第三层……一直到偶数层的最内层。

*

填充的算法是:每一层未填充的个数是(n-2*l)个,n是总层数,l是当前层数,为了便于数组的计算,这里层数也是从0开始,

* 即l=0时是第一层。每一轮填充都是从(l,l)开始的。←---字母l,不是数字1。   但是每一层都需要为邻边的填充留一个地方,比如填充顶部的时候,需要留出一个位置作为填充右部的开始,所以真正需要填充的个数是(n-2*l-1)。

* 当层数为l时,每一边的起始坐标分别是(上,右,下,左):

* (l,l)

* (l,n-l-1)

* (n-1,n-1)

* (n-1,l)

*

* 当层数为偶数层的时候,恰好最后一层每一边填充一个数。当层数为奇数层的时候,最后一层只剩一个数未填充(n-2*l-1)=0,所以需要手动将最后一个数填充进方阵中。

*

* 最后将填充好的方阵打印在控制台上。以上就是本题的思路和解决办法。

public static void main(String[] args) {
        System.out.println("输入方阵的层数(层数过大方阵的可读性会变差):");
        Scanner sc = new Scanner(System.in);
        //层数
        int n = sc.nextInt();
        //填充的数字,没填充一次自增一次 
        int var = 1;
        //方阵的中间,表示需要循环的次数,或者需要填充的“口”字个数。
        int limit = (int)Math.ceil(n/2.0) - 1;
        //定义一个n×n的矩阵来存储填充的数字
        int[][] metrix = new int[n][n];
        
        //嵌套的层数,循环limit次---limit个“口”
        for(int l=0;l<=limit;l++){
            /*填充顶部
             * 填充这一层时,i(横坐标)不变,j(纵坐标)递增,直到填充了(n-2*l-1)个数后退出这一层循环。
             */
            for(int i=l,j=i;j<l+(n-2*l-1);j++){
                metrix[i][j] = var++;
            }
            /*填充右边
             * 填充这一层时,j(纵坐标)不变,i(横坐标)递增,直到填充了(n-2*l-1)个数后退出这一层循环
             */
            for(int j=n-l-1,i=l;i<l+(n-2*l-1);i++){
                metrix[i][j] = var++;
            }
            /*填充底部
             * 填充这一层时,i(横坐标)不变,j(纵坐标)递减,直到填充了(n-2*l-1)个数后退出这一层循环。
             */
            for(int i=n-l-1,j=i;j>(n-l-1)-(n-2*l-1);j--){
                metrix[i][j] = var++;
            }
            /*填充左边
             * 填充这一层时,j(纵坐标)不变,i(横坐标)递减,直到填充了(n-2*l-1)个数后退出这一层循环
             */
            for(int i=n-l-1,j=l;i>(n-l-1)-(n-2*l-1);i--){
                metrix[i][j] =var++;
            }
        }
        //当层数是奇数时,以上算法并没有处理处于最中间的数,这里需要单独处理。
        if(n%2==1 && metrix[limit][limit] == 0){
            metrix[limit][limit] = var;
        }
        //打印
        printMetrix(metrix);
    }
    //打印矩阵,如果层数过高,需要将数字间的间隔加大(比如加更多的\t),否则可读性级差。
    public static void printMetrix(int[][] metrix){
        for(int i=0;i<metrix.length;i++){
            for(int j=0;j<metrix[i].length;j++){
                System.out.print(metrix[i][j] + "\t\t");
            }
            System.out.println();
        }
    }

打印螺旋矩阵数字

时间: 2024-10-12 13:00:54

打印螺旋矩阵数字的相关文章

C版——打印螺旋矩阵

1.递归解法 递归解法如下: +--------------------------> X 轴 | 1   2   3   4 |  12 13 14 5 |  11 16 15 6 |  10 9   8   7 | Y轴 设元素1的坐标为(0,0),元素13的坐标为(1,1),--,任一元素的坐标为(x,y) 1 #include <stdio.h> 2 3 void SetMatrix(int **matrix, int x, int y, int start, int n) {

剑指offer (20) 打印螺旋矩阵

题目描述: 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字 class Solution { public: vector<int> spiralOrder(vector<vector<int> > &matrix) { vector<int> result; int nRows = matrix.size(); if (nRows == 0) return result; int nCols = matrix.at(0).size()

打印螺旋矩阵

1 #include<stdio.h> 2 #include<stdlib.h> 3 #include<math.h> 4 5 #define MAX 64 6 7 void initArray(int array[][MAX], int n); 8 void printArray(int array[][MAX], int n); 9 10 int main() 11 { 12 int n; 13 int array[MAX][MAX]; 14 printf(&quo

编程题之打印二维螺旋矩阵

当size=4时, 二维螺旋矩阵如下图所示: 规律总结 可以把这个二维矩阵看成一层套一层,如上图所示,1->4->7->10->12为第零层, 13->14->15->16为第一层,所以当size=4时,总共有两层.规律如下: 可分层数为:若size为偶数,层数=size/2, 若为奇数,则层数=(size+1)/2; 第n层一个方向上的数字的数量为:size-2*n; 这是因为第零层的一个方向上数字的数量就是size, 而第一层是size-2,...第n层就是s

Java-基础编程(螺旋矩阵&amp;乘法表)

package cn.rick.study; import java.io.BufferedReader;import java.io.InputStreamReader;import java.util.Scanner; /** * * @author Rick-bao date 2014-8-29 * */public class SomeBasicCode { public static void main(String[] args) { MultiplicationTable();//

从外向内扩的螺旋矩阵

形如: 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 如果我们需要打印这样从外部向内扩展的n * n矩阵. 分析: 可以把矩阵分为n/2个圈, (上面的例子分了两个圈,最外面的圈就是12345~16,另外一个圈就是17~24) 我们只需要以圈为单位,给二维数组中的每个数赋值.赋值的顺序也是按照数字的递增顺序(顺时针) Java代码如下: public class SpiralMatrix

每日算法之四十一:Spiral Matrix II (螺旋矩阵)

Given an integer n, generate a square matrix filled with elements from 1 to n2 in spiral order. For example, Given n = 3, You should return the following matrix: [ [ 1, 2, 3 ], [ 8, 9, 4 ], [ 7, 6, 5 ] ] 针对这个问题采用最直观的方式即可,即螺旋插入,这里有两个地方需要注意,一个是插入边界的界定,

1050. 螺旋矩阵(25)

本题要求将给定的N个正整数按非递增的顺序,填入“螺旋矩阵”.所谓“螺旋矩阵”,是指从左上角第1个格子开始,按顺时针螺旋方向填充.要求矩阵的规模为m行n列,满足条件:m*n等于N:m>=n:且m-n取所有可能值中的最小值. 输入格式: 输入在第1行中给出一个正整数N,第2行给出N个待填充的正整数.所有数字不超过104,相邻数字以空格分隔. 输出格式: 输出螺旋矩阵.每行n个数字,共m行.相邻数字以1个空格分隔,行末不得有多余空格. 输入样例: 12 37 76 20 98 76 42 53 95

HLG 1564 螺旋矩阵 (趣味C语言)

链接: http://acm.hrbust.edu.cn/index.php?m=ProblemSet&a=showProblem&problem_id=1564 Description 对于给定的一个数n,要你打印n*n的螺旋矩阵. 比如n=3时,输出: 1 2 3 8 9 4 7 6 5 Input 多组测试数据,每个测试数据包含一个整数n(1<=n<=32) Output 对于每组测试数据,输出一个n*n的螺旋矩阵,定义在题目描述里. 在一组测试数据中,每个数占的字符宽度