Hello! I wrote a script that, in theory, should generate a 3x3 matrix in a spiral, starting from the left side. All anything, but at me the error jumps out that the variable number is not defined or is equal to zero. Please look at my code. Maybe I was wrong somewhere. I myself do not know what the matter is. I would be very grateful if you find any other shoals.

Rewrote the code, as advised. A 3x3 matrix is ​​formed, but is filled in incorrectly (

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); } } } 

As a result, a matrix of the following form should appear: enter image description here

3 answers 3

I think something like that. You can and shrink, but so clearer.

 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; } 

    Recursion solution

     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; } 

      The answer to C, you can remake, and can someone come in handy. The code is not optimal.

       #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; } 

      Result:

        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; 

      The upper code is not optimal, but lower is more optimal, which does not rely on data already entered in the matrix, thus it can be used to fill the matrix with arbitrary values, including zeros (though I have pointers, I don’t know how to repeat JS; is there a JS links). And no comments. Who worked, he will understand)

       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; } }