广度首先遍历对象

Pet*_*son 4 javascript jquery json breadth-first-search

我正在制作一个解决益智游戏的程序,它会在棋盘上找到所有可能的移动并将所有可能产生的棋盘放在一个对象中.然后它会找到所得到的电路板的所有可能移动,依此类推.该对象看起来像这样:

{
  "board": {
      "starts": [[0,0],[0,3]],
      "blocks": [[3,0],[3,3]],
      "ends":   [[2,4]]
  },
  "possibleMoves": [
    {
      "board": {
        "starts": [[0,0],[2,3]],
        "blocks": [[3,0],[3,3]],
        "ends":   [[2,4]]
      },
      "possibleMoves":[
        {
          "board": {},
          "possibleMoves": [{}]
        }
      ]
    },
    {
      "board": {
        "starts": [[0,3]],
        "blocks": [[3,0],[3,3]],
        "ends":   [[2,4]]
      },
      "possibleMoves":[{}]
    }]
}
Run Code Online (Sandbox Code Playgroud)

我可以弄清楚如何从顶层电路板添加可能的移动,但我无法弄清楚如何在第二级循环所有生成的电路板并找出它们可能的移动,然后循环遍历所有第三级电路板等等.如何使用广度优先搜索添加可能的移动并遍历对象?

Sam*_*war 21

递归.

function traverse(state) {
    handle(state.board);
    if (state.possibleMoves) {
        $.each(state.possibleMoves, function(i, possibleMove) {
             traverse(possibleMove);
        });
    }
}
Run Code Online (Sandbox Code Playgroud)

编辑:对于广度优先搜索,尝试这样的事情.它不使用递归,而是迭代在不断增长的队列中.

function traverse(state) {
    var queue = [],
        next = state;
    while (next) {
        if (next.possibleMoves) {
            $.each(next.possibleMoves, function(i, possibleMove) {
                queue.push(possibleMove);
            });
        }
        next = queue.shift();
    }
}
Run Code Online (Sandbox Code Playgroud)