蛇形矩阵(非方阵)的一种实现形式

    背景

    最近接触到了一个有意思的题目,花了点时间解答了一下,在此分享下!

    题目为:

    蛇形矩阵(非方阵)的一种实现形式_第1张图片

   题目解析

   刚看到这个题目的时候,请教了一个好基友,由于他是做数据挖掘的,所以对矩阵比较熟悉。他看了一眼,就告诉我这是蛇形矩阵,并给了我一个链接 上面有Java实现的源码。
   但是,该源码的实现只能是针对nXn的方形矩阵,如果n不等于m呢?显然该链接中的代码就不能满足要求了。
   其实本题中要求n,m为任意正整数,且n不一定等于m,然后输出蛇形矩阵,要求用代码实现。

  解题思路分析

  观察该矩阵,其中的数值递增是弯曲的,像蛇一样:
  蛇形矩阵(非方阵)的一种实现形式_第2张图片
   之前的链接里面实现的思路中需要将举证分解成左上三角矩阵和右下三角矩阵,但是如果不是方阵,该怎么分解呢?想了一段时间,还是不知道怎么解决。看来,矩阵分解成上下两个三角矩阵是行不通了。
    于是,我在想:可不可以按照上图中标出来的箭头指向,根据箭头的指向逐一的赋值整个矩阵?
    接着我开始编码,用一个变量k来标示运动方向:
    蛇形矩阵(非方阵)的一种实现形式_第3张图片
   感觉上面的思路可以满足任意矩阵的赋值,不管n等不等于m,运动方向是不会受到n,m的影响的,只是需要将运动方向以及何时变化运动方向考虑清楚。
   根据这个思路,我开始编程了。但是,刚开始思路很混乱,而且此时已是凌晨1点多,眼睛都不自主的闭上了,所以折腾了一个多小时,直到2:30,虽然把整个实现的代码框架写完了。但是,一运行,根本不能满足要求。实在是太累了,就去睡了四个小时。
   苦逼的打工仔,6点多钟就起床,洗漱,吃早餐,挤地铁,终于达到公司了。
   于是,接着之前的思路进行整理,睡了一觉,果然头脑清醒了不少。在原来的基础上,并不断的早草稿纸上模拟,画图,并理顺思路。
    终于得到明确的思路: 
1. 初始的时候,行标i=0,列标j=0,data[i][j]=0,此时k = 1(k表示当前矩阵位置到下一位置的运动方向);
2. 当data移动到下一个位置后,此时需要把k变为它当前位置的移动方向。
    1) k = 1的时候,k的下一个运动方向可能是 2或者4;
        A. data位于矩阵的第一行时,k变为2;
       B. data位于矩阵的最下面一行时,k变为4.
     2) k = 2的时候,k的下一个运动方向可能是 1或者2或者3;
        A. data位于矩阵的第一列时,k变为3;
       B. data位于矩阵的最下面一行时,k变为1;
       C. data位于矩阵其它位置时,k仍为2.
3) k = 3的时候,k的下一个运动方向可能是 2或者4;
        A. data位于矩阵的第一列时,k变为4;
        B. data位于矩阵的最后一列时,k变为2.
4) k = 4的时候,k的下一个运动方向可能是1或者3或者4;
        A. data位于矩阵的第一行时,k变为1;
        B. data位于矩阵的最后一列时,k变为3;
C. data位于矩阵其它位置时,k仍为4.
此外,有左下顶角和右上顶角的位置需要额外关注。

解题结果

根据上面的思路,用代码实现后得到的测试结果如下:
蛇形矩阵(非方阵)的一种实现形式_第4张图片

蛇形矩阵(非方阵)的一种实现形式_第5张图片

    蛇形矩阵(非方阵)的一种实现形式_第6张图片

   源码实现

package macor.matrix;
import java.util.*;


public class NMMatrix {
    int n;
    int m;

    public NMMatrix(int n, int m){
        this.n = n;
        this.m = m;
    }

    public void generateArray(int n,int m){
        int i = 0;  //行
        int j = 0;	//列
        int k = 1;  //运动方向. k =1 表示运动方向为从左往右移动;k=2 表示从右上角往左下角移动; k=3 表示向下移动 ;k=4 表示从左下角网右上角移动
        int [][] data =new int [n][m];
        data[0][0] = 1;
        while( i!=n-1 || j !=m-1){
           // System.out.println("i="+i+" j="+j+" d="+data[i][j]+ " k="+k);
            if(k == 1){
                data[i][j+1] = data[i][j] + 1;
                j = j + 1;
                if(i == n-1){
                    k = 4;
                }else{
                    k = 2;
                }
            }else if(k == 2){
                data[i+1][j-1] = data[i][j] + 1;
                j = j - 1;
                i = i +1;
                if( j == 0 && i != n-1){
                    k = 3;
                }else if( i == n-1){
                    k = 1;
                }else{
                    k = 2;
                }
            }else if(k == 3){
                data[i+1][j] = data[i][j] + 1;
                i = i+1;
                if( j ==  m-1){
                    k = 2;
                }else {
                    k = 4;
                }
            }else if(k == 4){
                data[i-1][j+1] = data[i][j] + 1;
                j = j + 1;
                i = i - 1;

                if(i == 0 && j != m-1){
                    k = 1;
                }else if( j == m-1  )
                {
                    k = 3;
                }else{
                    k = 4;
                }
            }
        }
        //System.out.println("Finished");
        //System.out.println("i="+i+" j="+j+" d="+data[i][j]+ " k="+k);

        System.out.println("生成的矩阵如下:");

        //显示矩阵
        for(int a=0;a
   其实我几乎没用过Java,所以源码中的一些地方不是很规范,仅供参考。

你可能感兴趣的:(蛇形矩阵(非方阵)的一种实现形式)