RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 713845
Accepted
kittycat_13
kittycat_13
Asked:2020-09-03 18:52:41 +0000 UTC2020-09-03 18:52:41 +0000 UTC 2020-09-03 18:52:41 +0000 UTC

在螺旋 JS 中用整数填充矩阵

  • 772

你好!我写了一个脚本,理论上,应该从左侧开始生成一个螺旋形的 3x3 矩阵。一切都会好的,但我收到一个错误,即数字变量未定义或等于零。请看我的代码。也许我在某个地方犯了一个错误。我不知道怎么了。如果您找到任何其他门框,我将不胜感激。

我按照建议重写了代码。形成了一个3x3的矩阵,但是填错了(

var numbers = [1,2,3,4,5,6,7,8,9];
var dimension = 3;
var matrix = [];
for(var d = 0; d<dimension; d++){
    matrix[d] = [];
}

    makeMatrix(numbers, dimension, matrix);


function makeMatrix(numbers, dimension, matrix){
    for(var n = 0; n < numbers.length; n++){
  var i = 0; 
  var j = 0;
    var number = numbers[n];
    moveDown(i, j, matrix, number);
  }
  console.log(matrix);
}

function moveDown(i, j, matrix, number){
    for(j; j<dimension; j++){
    matrix[i][j]=number;
    if(matrix[i][j+1]!="" && matrix[i+1][j]==""){
        i = i+1;
      moveRight(i, j, matrix, number);
        }
    }
  }

  function moveRight(i, j, matrix, number){
    for(i; i<dimension; i++){
        matrix[i][j]=number;
      if(matrix[i+1][j]!="" && matrix[i][j-1]==""){
        j = j-1;
        moveUp(i, j, matrix, number);
      }
    }
  }

  function moveUp(i, j, matrix, number){
    for(j; j>=0; j++){
        matrix[i][j]=number;
      if(matrix[i][j-1]!="" && matrix[i-1][j]==""){
        i = i-1;
        moveLeft(i, j, matrix, number);
      }
    }
  }

  function moveLeft(i, j, matrix, number){
    for(i; i>=0; i++){
        matrix[i][j]=number;
      if(matrix[i-1][j]!="" && matrix[i][j+1]==""){
        dimension = dimension/2;
        makeMatrix(numbers, dimension);
      }
    }
  }

结果应该是这样的矩阵: 在此处输入图像描述

javascript
  • 3 3 个回答
  • 10 Views

3 个回答

  • Voted
  1. user239133
    2020-09-03T20:58:15Z2020-09-03T20:58:15Z

    答案在 C 语言中,你可以重做它,它可能会派上用场。代码不是最优的。

    #include <stdio.h>
    
    #define M 6
    #define N 8
    
    int matrix[M][N];
    
    void fill_spiral()
    {
        int
            i, // столбец
            j, // строка
            dj, di, // направление движения
            v, // значение
            tmp_di; // временная переменная
    
        // заполняем нулями
        for (j = 0; j < M; j++)
            for (i = 0; i < N; i++)
                matrix[j][i] = 0;
    
        // заполняем по спирали
        for (v = 1, i = 0, j = -1, dj = 1, di = 0; v <= M*N; v++) {
    
            // делаем шаг
            i += di; j += dj;
    
            // если въехали в уже заполненное или выехали за пределы матрицы
            if (i < 0 || j < 0 || i == N || j == M || matrix[j][i] != 0) {
    
                // отменяем шаг
                i -= di; j -= dj;
    
                // возвращаем значение
                v--;
    
                // применяем матрицу поворота на PI/2 для направления
                tmp_di = di;
                di = dj;
                dj = -tmp_di;
    
                continue;
            }
    
            // заполняем матрицу
            matrix[j][i] = v;
        }
    }
    
    int main()
    {
        int i, j;
        fill_spiral();
        for (j = 0; j < M; j++)
        {
            printf("%3d", matrix[j][0]);
            for (i = 1; i < N; i++)
                printf(", %3d", matrix[j][i]);
            puts(";");
        }
        return 0;
    }
    

    结果:

      1,  24,  23,  22,  21,  20,  19,  18;
      2,  25,  40,  39,  38,  37,  36,  17;
      3,  26,  41,  48,  47,  46,  35,  16;
      4,  27,  42,  43,  44,  45,  34,  15;
      5,  28,  29,  30,  31,  32,  33,  14;
      6,   7,   8,   9,  10,  11,  12,  13;
    

    上面的代码不是最优的,但下面是更优的,它不依赖于已经输入到矩阵中的数据,因此它可以用来用任意值填充矩阵,包括零(虽然我在这里有指针,但我没有'不知道如何在 JS 中重复;是否有任何链接)。而且已经没有评论了。工作过的人会明白

    void fill_spiral()
    {
        int i = 0, j = -1, dj = 1, di = 0, v = 1, tmp_di, stepsN = N,
            stepsM = M, *steps = &stepsM, k;
        while (*steps > 0) {
            for (k = 0; k < *steps; k++) {
                i += di; j += dj;
                matrix[j][i] = v++;
            }
            steps = (dj == 0 ? &stepsM : &stepsN); (*steps)--;
            tmp_di = di; di = dj; dj = -tmp_di;
        }
    }
    
    • 2
  2. Best Answer
    MedvedevDev
    2020-09-03T22:37:42Z2020-09-03T22:37:42Z

    我想是这样的。你也可以缩小,但更明显。

    matrixView(spiralMatrix(2));
    matrixView(spiralMatrix(3));
    matrixView(spiralMatrix(4));
    matrixView(spiralMatrix(5));
    
    function spiralMatrix( dimension ) {
      let matrix = [],
        x = y = 0,
        steps = dimension - 1; // Кол-во шагов в ту или иную сторону
        
      for(let i = 0; i < dimension; i++) matrix[i] = []; // Создаем матрицу
    
      for(let i = 1; i <= Math.pow(dimension, 2); i++) {
        matrix[y][x] = i; // Задаем значение
    
        // Меняем кол-во шагов
        if(x === steps && y === dimension - steps - 1) steps--;
    
        // Движение "вниз"
        if((y >= x && y < steps) || (x - 1 === y && x === dimension - steps - 1)) y++;
        // Движение "вверх"
        else if(y <= x && y >= dimension - steps) y--;
        // Движение "вправо"
        else if(x <= y && x < steps) x++;
        // Движение "влево"
        else if(x >= y && x >= dimension - steps) x--;
      }
      
      return matrix;
    }
    
    function matrixView( matrix ) {
      let rows = '';
    
      for(let i = 0; i < matrix.length; i++) {
        let cells = '';
    
        for(let j = 0; j < matrix[i].length; j++) {
          cells += '<div class="block_cell">' + matrix[i][j] + '</div>';
        }
    
        rows += '<div class="block_row">' + cells + '</div>';
      }
    
      document.querySelector('body').insertAdjacentHTML('beforeend', '<div class="block">' + rows + '</div>');
    }
    body {
      background-color: #dddddd;
    }
    
    .block {
      margin-bottom: 20px;
    }
    
    .block_row {
      font-size: 0;
    }
    
    .block_cell {
      display: inline-block;
      vertical-align: top;
      width: 40px;
      height: 40px;
      margin: 3px;
      border-radius: 4px;
      box-shadow: 1px 1px 3px #a0a0a0;
      background-color: #fff;
      font-family: Arial, sans-serif;
      font-size: 14px;
      text-align: center;
      line-height: 40px;
    }

    • 2
  3. Robert Dampilon
    2020-09-03T23:59:45Z2020-09-03T23:59:45Z

    通过递归解决

    var numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25];
    var x = 0,
        y = 0;
    
    var direction = 'right';
    var numberPosition = 0;
    var innerDimension;
    var dimension = 5;
    var oldPosition;
    
    
    var matrix = createMatrix(5, 5);
    
    fillMatrix();
    
    // Результат
    console.log(matrix);
    
    function fillMatrix(){
    
        if (!numbers.length) return;
    
        var num = numbers.shift();
    
        matrix[x][y] = num;
    
        ++numberPosition;
    
        // Матрица заполнена
        if (innerDimension === 0) return;
    
        // Последнее значение поля матрицы
        if (innerDimension === 1) {
    
            getNextDirection();
            setNextPosition();
            innerDimension = 0;
            fillMatrix();
            return;
    
        }
    
        // Первый поворот
        if (numberPosition === innerDimension || numberPosition === dimension) {
    
            getNextDirection();
            setNextPosition();
            oldPosition = numberPosition;
            innerDimension = dimension - 1;
            fillMatrix();
    
            return;
    
        }
    
        // Поворот направления
        if (numberPosition === oldPosition + innerDimension || numberPosition === oldPosition + (innerDimension * 2)) {
    
            if (numberPosition === oldPosition + (innerDimension * 2)) {
                innerDimension = innerDimension - 1;
                oldPosition = numberPosition;
            }
    
            getNextDirection();
            setNextPosition();
    
            fillMatrix();
    
            return;
    
        }
    
    
        setNextPosition();
    
        fillMatrix();
    
    }
    
    function setNextPosition() {
    
        if (direction == 'right') {
            y = y + 1;
        }
    
        if (direction == 'down') {
            x = x + 1;
        }
    
        if (direction == 'left') {
            y = y - 1;
        }
    
        if (direction == 'top') {
            x = x - 1;
        }
    
    }
    
    function getNextDirection() {
    
        if (direction === 'right') {
            direction = 'down';
            return;
        }
    
        if (direction === 'down'){
            direction = 'left';
            return;
        }
    
        if (direction === 'left') {
            direction =  'top';
            return;
        }
    
        if (direction === 'top') {
            direction = 'right';
        }
    
    }
    
    function createMatrix(x, y) {
        var matrix = [];
        for (var i = 0; i < x; i++) {
            matrix[i] = Array(y);
        }
        return matrix;
    }
    
    • 2

相关问题

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    Python 3.6 - 安装 MySQL (Windows)

    • 1 个回答
  • Marko Smith

    C++ 编写程序“计算单个岛屿”。填充一个二维数组 12x12 0 和 1

    • 2 个回答
  • Marko Smith

    返回指针的函数

    • 1 个回答
  • Marko Smith

    我使用 django 管理面板添加图像,但它没有显示

    • 1 个回答
  • Marko Smith

    这些条目是什么意思,它们的完整等效项是什么样的

    • 2 个回答
  • Marko Smith

    浏览器仍然缓存文件数据

    • 1 个回答
  • Marko Smith

    在 Excel VBA 中激活工作表的问题

    • 3 个回答
  • Marko Smith

    为什么内置类型中包含复数而小数不包含?

    • 2 个回答
  • Marko Smith

    获得唯一途径

    • 3 个回答
  • Marko Smith

    告诉我一个像幻灯片一样创建滚动的库

    • 1 个回答
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Алексей Шиманский 如何以及通过什么方式来查找 Javascript 代码中的错误? 2020-08-03 00:21:37 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    user207618 Codegolf——组合选择算法的实现 2020-10-23 18:46:29 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5