蛇形矩阵

Posted 火雨(Nick)

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了蛇形矩阵相关的知识,希望对你有一定的参考价值。

     生成并打印如下蛇形矩阵:

          技术分享

     可以把矩阵想像成若干个圈,从外到内依次生成并打印蛇形矩阵。

     对于一个4×4的矩阵,最后一圈有4个数字,其左上角的坐标是(1,1),我们发现4>1×1;

     对于一个5×5的矩阵,最后一圈只有一个数字,对应坐标为(2,2),我们发现5>2×2依然成立。

     所以可以得出让循环的继续条件为:维数dime > start * 2。

     打印可以分为4步:从左到右生成一行,从上到下生成一列,从右到左生成一行,从下到上生成一行。

     测试程序中设置了矩阵可以接受的最大维数和非法值判断(负值、0、1)。

     Java源代码如下:

package array;

/**
 * @author WuPing
 * @version 2016年4月28日 上午9:59:14
 */

public class SnakeMatrix {

    public static int[][] CreateSnakeMatrix(int dime) {
    int[][] snakeMatrix = new int[dime][dime];

    int count = 1; // 蛇形矩阵赋值计数
    int start = 0;

    while (dime > start * 2) {
        int endX = dime - 1 - start;
        int endY = dime - 1 - start;

        // 从左到右生成一行
        for (int i = start; i <= endX; ++i) {
        snakeMatrix[start][i] = count;
        count++;
        }

        // 从上到下生成一列
        for (int i = start + 1; i <= endY; ++i) {
        snakeMatrix[i][endX] = count;
        count++;
        }

        // 从右到左生成一行
        for (int i = endX - 1; i >= start; --i) {
        snakeMatrix[endY][i] = count;
        count++;
        }

        // 从下到上生成一行
        for (int i = endY - 1; i >= start + 1; --i) {
        snakeMatrix[i][start] = count;
        count++;
        }

        ++start;
    }
    return snakeMatrix;
    }

    public static void PrintSnakeMatrix(int[][] snakeMatrix, int dime) {
    for (int i = 0; i < dime; i++) {
        for (int j = 0; j < dime; j++) {
        System.out.print(" " + snakeMatrix[i][j] + " ");
        }
        System.out.println();
    }
    }

    public static void Test(int dime) {
    int DimeMax = 50;   //设置矩阵最大维数,防止二维数组存储空间溢出
    if (dime < 2 || dime > DimeMax) {
        System.out.println("矩阵维数非法!");
        return;
    }
    int[][] snakeMatrix = CreateSnakeMatrix(dime);
    System.out.println(dime +"维蛇形矩阵:");
    PrintSnakeMatrix(snakeMatrix, dime);
    System.out.println();
    }
    
    public static void main(String[] args) {
    Test(1);   //非法值测试,1
    Test(0);   //非法值测试,0
    Test(-1);   //非法值测试,负值
    Test(100);   //非法值测试,超过上界
    
    Test(5);   //中间值测试
    Test(8);   //中间值测试
    Test(2);   //下界值测试
    Test(50);   //上界值测试
    }
}

     结果截图:

        技术分享

   附录:

     来个好玩的螺旋矩阵。

     来源博文:螺旋队列算法分析http://blog.csdn.net/yhmhappy2006/article/details/2934435

     螺旋矩阵示例如下:

              技术分享

    Java实现代码:

package array;

/**
 * @author WuPing
 * @version 2016年4月28日 下午3:46:44
 */

public class SpiralqMatrix {
    
    private static int Max(int a1, int a2) {  
        return a1 < a2 ? a2 : a1;  
    }  
  
    private static int Abs(int x) {  
        return x < 0 ? -x : x;  
    }  

    public static void PrintSpiralMatrix(int x, int y) {
    int c = Max(Abs(x), Abs(y));    // 当前坐标所在圈  
    int max = (c * 2 + 1) * (c * 2 + 1);// 当前圈上最大值  
    int number = 0; 
        if (y == -c) {  //上边  
            number = max + (x + y);  
        } else if (x == -c) {  //左边  
            number = max + (3 * x - y);  
        } else if (y == c) {  // 下边  
            number = max + (-x - 5 * y);  
        } else {    // 右边  
            number = max + (-7 * x + y);  
        }  
        
        System.out.print(" " + number + " ");
    }

    public static void Test(int dime) {
    int DimeMax = 20;   //设置矩阵最大维数,防止二维数组存储空间溢出
    if (dime < 1 || dime > DimeMax) {
        System.out.println("矩阵维数非法!");
        return;
    }
    System.out.println(dime*2+1 +"维螺旋矩阵:");
    for(int y=-dime; y<=dime; y++) {
        for(int x=-dime; x<=dime; x++) {
        PrintSpiralMatrix(x, y);   
        }
        System.out.println();
    }
    }
    
    public static void main(String[] args) {   
    Test(0);   //非法值测试,0
    Test(-1);   //非法值测试,负值
    Test(60);   //非法值测试,超过上界
    
    Test(1);   //下界值测试
    Test(2);   //中间值测试
    Test(8);   //中间值测试
    Test(20);   //上界值测试
    }
}

      程序运行结果:

     技术分享

以上是关于蛇形矩阵的主要内容,如果未能解决你的问题,请参考以下文章

蛇形矩阵

EOJ3536 蛇形矩阵---找规律

蛇形矩阵

蛇形矩阵

蛇形三角矩阵

蛇形矩阵与螺旋矩阵