Fork me on GitHub

蛇形矩阵

    《程序员面试金典》Java版代码全集:https://github.com/wuping5719/Algorithm/tree/master/5-CrackingCodingInterview

      鹅厂实习时笔试题1:生成并打印如下蛇形矩阵:

          

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

     对于一个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);   //上界值测试
    }
}

      程序运行结果:

     

posted @ 2016-05-24 16:14  火雨(Nick)  阅读(734)  评论(0编辑  收藏  举报