Maison  >  Article  >  interface Web  >  Question amusante JavaScript : matrice en spirale

Question amusante JavaScript : matrice en spirale

黄舟
黄舟original
2017-01-22 14:58:381421parcourir

Étant donné un tableau bidimensionnel n * n, utilisez l'algorithme de matrice spirale pour le parcourir et renvoyer le chemin.

L'exemple est le suivant :

array = [[1,2,3],  
      [4,5,6],  
      [7,8,9]]  
snail(array) // => [1,2,3,6,9,8,7,4,5]

L'exemple de ce programme n'est peut-être pas intuitif, alors prenons une photo pour montrer le processus.

Question amusante JavaScript : matrice en spirale

Comme vous pouvez le constater, c'est comme une personne qui avance dans un labyrinthe. Elle se situe d'abord à la position (0,0), puis marche vers la droite, et quand il rencontre la limite, il Au lieu de cela, j'ai descendu et j'ai rencontré à nouveau la limite, alors j'ai changé vers la gauche....

Une personne prudente peut rapidement découvrir un motif :

La personne dans le labyrinthe dispose de quatre stratégies de voyage de base.

1. En marchant vers la droite, si vous rencontrez la limite ou si la grille à droite a été dépassée, alors descendez, sinon continuez à droite.

2. En descendant, si vous rencontrez une limite ou si la grille en dessous a été dépassée, alors allez à gauche, sinon continuez à descendre.

3. En marchant à gauche, si vous rencontrez la limite ou si la grille à gauche a été dépassée, alors montez, sinon continuez à aller à gauche.

4. En montant, si vous rencontrez une limite ou si la grille supérieure a été dépassée, alors allez à droite, sinon continuez à monter.

Comme vous pouvez le voir, il s'agit d'un processus récursif, alors quand se terminera-t-il ?

Lorsque cette personne a visité chaque grille, cela se termine.

Le programme que j'ai écrit ci-dessous utilise un tableau bidimensionnel de type booléen pour enregistrer si la grille a été passée.

Présente quatre fonctions, haut, bas, gauche et droite, représentant respectivement quatre stratégies.

function snail(array) {  
    //当前行  
    var row = 0;  
    //当前列  
    var col = 0;  
    //对应的存放boolean值的二维数组  
    var hasVisited = [];  
    //存放结果的数组  
    var result = [];  
    //数组元素个数  
    var size = array.length * array[0].length;  
      
    //boolean二维数组初始化  
    for (var i = 0; i < array.length; i++) {  
        var temp = [];  
        var len = array[i].length;  
        for (var j = 0; j < len; j++) {  
            temp.push(false);  
        }  
        hasVisited.push(temp);  
    }  
  
    function right() {  
        if (result.length < size) {  
            result.push(array[row][col]);  
            hasVisited[row][col] = true;  
            if (col + 1 >= array.length || hasVisited[row][col + 1]) {  
                row += 1;  
                down();  
            } else {  
                col += 1;  
                right();  
            }  
        }  
    }  
  
    function down() {  
        if (result.length < size) {  
            result.push(array[row][col]);  
            hasVisited[row][col] = true;  
            if (row + 1 >= array.length || hasVisited[row + 1][col]) {  
                col -= 1;  
                left();  
            } else {  
                row += 1;  
                down();  
            }  
        }  
    }  
  
    function left() {  
        if (result.length < size) {  
            result.push(array[row][col]);  
            hasVisited[row][col] = true;  
            if (col == 0 || hasVisited[row][col - 1]) {  
                row -= 1;  
                up();  
            } else {  
                col -= 1;  
                left();  
            }  
        }  
    }  
  
    function up() {  
        if (result.length < size) {  
            result.push(array[row][col]);  
            hasVisited[row][col] = true;  
            if (hasVisited[row - 1][col]) {  
                col += 1;  
                right();  
            } else {  
                row -= 1;  
                up();  
            }  
        }  
    }  
    //首先往右走  
    right();  
    return result;  
}

Ce qui précède est le contenu de questions JavaScript intéressantes : Spiral Matrix Pour plus de contenu connexe, veuillez faire attention au site Web PHP chinois (www.php.cn) !

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn