蛇形矩阵
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); //上界值测试
程序运行结果:
以上是关于蛇形矩阵的主要内容,如果未能解决你的问题,请参考以下文章