Maison > Article > interface Web > Question amusante JavaScript : matrice en spirale
É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.
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) !