ホームページ  >  記事  >  ウェブフロントエンド  >  JavaScript の楽しい質問: スパイラル マトリックス

JavaScript の楽しい質問: スパイラル マトリックス

黄舟
黄舟オリジナル
2017-01-22 14:58:381407ブラウズ

n*n の 2 次元配列が与えられた場合、スパイラル行列アルゴリズムを使用してそれを走査し、パスを返します。

例は次のとおりです:

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

このプログラムの例は直感的ではないかもしれないので、プロセスを示すために写真を撮りましょう。

JavaScript の楽しい質問: スパイラル マトリックス

ご覧のとおり、人が迷路の中を前進しているようなものです。最初は (0,0) の位置に位置し、次に右に歩き、境界に遭遇し、次に下に歩き始めます。

慎重な人はすぐにパターンを発見します:

迷路の中にいる人には 4 つの基本的な移動戦略があります。

1. 右に歩いているときに、境界線に遭遇するか、右側のグリッドを通過した場合は下に進み、そうでない場合は右に進みます。

2. 下に歩いているときに、境界線に遭遇するか、下のグリッドを通過した場合は左に進み、そうでない場合は下に進みます。

3. 左に歩くとき、境界線に遭遇するか、左側のグリッドを通過した場合は上に進み、そうでない場合は左に進みます。

4. 上に向かって歩くとき、境界に遭遇するか、上のグリッドを通過した場合は右に進み、そうでない場合は上に歩き続けます。

ご覧のとおり、これは再帰的なプロセスなので、いつ終了するのでしょうか?

この人がすべてのグリッドを訪問すると、終了します。

以下に書いたプログラムは、ブール型の二次元配列を使用して、グリッドを通過したかどうかを記録します。

4 つの機能を紹介します: 上、下、左、右、それぞれ 4 つの戦略を表します。

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

上記は、JavaScript に関する興味深い質問の内容です: Spiral Matrix の関連コンテンツについては、PHP 中国語 Web サイト (www.php.cn) に注目してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。