Javascript 对象的宽度优先遍历
我正在制作一个程序来解决一个益智游戏,它会在一个棋盘上找到所有可能的移动,并将所有可能产生的棋盘放入一个对象中。然后,它会为生成的板找到所有可能的移动,依此类推。对象的外观如下所示:Javascript 对象的宽度优先遍历,javascript,jquery,json,breadth-first-search,Javascript,Jquery,Json,Breadth First Search,我正在制作一个程序来解决一个益智游戏,它会在一个棋盘上找到所有可能的移动,并将所有可能产生的棋盘放入一个对象中。然后,它会为生成的板找到所有可能的移动,依此类推。对象的外观如下所示: { "board": { "starts": [[0,0],[0,3]], "blocks": [[3,0],[3,3]], "ends": [[2,4]] }, "possibleMoves": [ { "board": {
{
"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":[{}]
}]
}
我可以想出如何从顶层板添加可能的移动,但我无法想出如何在第二层板中循环所有生成的板并找出它们可能的移动,然后循环所有第三层板,依此类推。如何使用广度优先搜索添加可能的移动和遍历对象?递归
function traverse(state) {
handle(state.board);
if (state.possibleMoves) {
$.each(state.possibleMoves, function(i, possibleMove) {
traverse(possibleMove);
});
}
}
编辑:对于广度优先搜索,请尝试以下方法。它不使用递归,而是在不断增长的队列上迭代
function traverse(state) {
var queue = [],
next = state;
while (next) {
if (next.possibleMoves) {
$.each(next.possibleMoves, function(i, possibleMove) {
queue.push(possibleMove);
});
}
next = queue.shift();
}
}
未完全测试:
var oo = {
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]]
},
}],
};
function traverseObject (o) {
for (var prop in o) {
if (typeof o[prop] == "array" || typeof o[prop] == "object") {
traverseObject(o[prop]);
console.log(prop);
} else {
console.log(prop, "=", o[prop]);
}
}
}
traverseObject(oo);
我没有JavaScript描述,但我通常会保留一个未探测节点队列
你可能想在这里搜索“递归”和“递归函数”,一般来说,网络应该有丰富的信息。你熟悉递归吗?仔细想想,这不是处理第一级,然后在第二级遍历第一块板,处理它,然后在第三级遍历第一块板,依此类推吗?我希望它处理第一块板,然后在第三层开始处理任何东西之前遍历第二层的所有板。对。在这种情况下,您需要实现一个队列。我向你们展示的是深度优先遍历。您需要宽度优先遍历。检查一个合适的算法。好的。我想我不太清楚我想要什么。我修改了问题。