以螺旋形式插入矩阵中的元素

时间:2016-07-16 10:36:09

标签: matrix spiral

给定数字x,以矩阵形式螺旋地插入元素1到x ^ 2。 例如对于x = 3,矩阵看起来像[[1,2,3],[8,9,4],[7,6,5]]。 为此,我写了以下代码片段。但是,我得到o [p [[7,9,5],[7,9,5],[7,9,5]]

while(t<=b && l<=r){
               System.out.print(t+" "+b+" "+l+" "+r+"\n");
        if(dir==0){
            for(int i = l;i<=r;i++){
                arr.get(t).set(i,x);
                x++;
            }

            t++;
        }else if(dir==1){
            for(int i = t;i<=b;i++){
                arr.get(i).set(r,x);
                x++;
            }
            r--;
        }else if(dir==2){
            for(int i = r;i>=l;i--){
                arr.get(b).set(i,x);
                x++;
            }
            b--;
        }else if(dir==3){
            for(int i = b;i>=t;i--){
                arr.get(l).set(i,x);
                x++;
            }
            l++;
        }
        dir = (dir+1)%4;

    }

2 个答案:

答案 0 :(得分:0)

您可以使用下一个代码(我为一些处理巨大的martrix大小的实现开发的代码)。它将使用任何矩阵大小的宽度(列)和高度(行)并生成所需的输出

    List<rec> BuildSpiralIndexList(long w, long h)
    {
        List<rec> result = new List<rec>();
        long count = 0,dir = 1,phase = 0,pos = 0;
        long length = 0,totallength = 0;
        bool isVertical = false;

        if ((w * h)<1) return null;
        do
        {
            isVertical = (count % 2) != 0;
            length = (isVertical ? h : w) - count / 2 - count % 2;
            phase = (count / 4);
            pos = (count % 4);
            dir = pos > 1 ? -1 : 1;
            for (int t = 0; t < length; t++)
                // you can replace the next code with printing or any other action you need
                result.Add(new rec()
                {
                    X = ((pos == 2 || pos == 1) ? (w - 1 - phase - (pos == 2 ? 1 : 0)) : phase) + dir * (isVertical ? 0 : t),
                    Y = ((pos <= 1 ? phase + pos : (h - 1) - phase - pos / 3)) + dir * (isVertical ? t : 0),
                    Index = totallength + t
                });
            totallength += length;
            count++;
        } while (totallength < (w*h));
        return result;
    }

答案 1 :(得分:0)

此解决方案从左上角到右上角,从右上角到右下角,从右下角到左下角,从左下角到左上角。 这是一个棘手的问题,希望我在下面的评论有助于解释。

下面是一个代码笔链接,可以看到它已添加到表中。     https://codepen.io/mitchell-boland/pen/rqdWPO

const n = 3; // Set this to a number

matrixSpiral(n);

function matrixSpiral(number){

    // Will populate the outer array with n-times inner arrays
    var outerArray = [];

    for(var i = 0; i < number; i++){
      outerArray.push([]);
    }


    var leftColumn = 0;
    var rightColumn = number - 1;
    var topRow = 0;
    var bottomRow = number-1;
    var counter = 1; // Used to track the number we are up to.

    while(leftColumn <= rightColumn && topRow  <=bottomRow){

        // populate the top row
        for(var i = leftColumn; i <= rightColumn; i++){
          outerArray[leftColumn][i] = counter;
          counter++;
        }
        // Top row is now populated
        topRow ++;

        // Populate the right column
        for(var i = topRow ; i <= bottomRow; i++){
          outerArray[i][rightColumn] = counter;
          counter++;
        }
        // Right column now populated.
        rightColumn--;

        // Populate the bottom row
        // We are going from the bottom right, to the bottom left
        for(var i = rightColumn; i >= leftColumn; i--){
          outerArray[bottomRow][i] = counter;
          counter++;
        }
        // Bottom Row now populated
        bottomRow--;

        // Populate the left column
        // We are going from bottom left, to top left
        for(var i = bottomRow; i >= topRow ; i--){
          outerArray[i][leftColumn] = counter;
          counter++;
        }
        // Left column now populated.
        leftColumn++;

        // While loop will now repeat the above process, but a step in.
    }

    // Console log the results.
    for(var i = 0; i < number; i++){
        console.log(outerArray[i]);
    }
}