Breadth first traversal of object

前端 未结 3 1398
南旧
南旧 2021-02-02 04:47

I am making a program that solves a puzzle game, and it finds all the possible moves on a board and puts all the possible resulting boards in an object. Then it finds all the po

相关标签:
3条回答
  • 2021-02-02 04:52

    I don't have a JavaScript description but i would generally do it by keeping a queue of unexplored nodes.

    1. Start with only the root node in the queue.
    2. Pop an item from the front of the queue
    3. Explore it add all of the nodes found during exploration to the back of the queue
    4. Check if there are any nodes in the queue if there are go back to step 2
    5. Your done

    Also there is some pseudopod on the Wikipedia page as well as some more explanations HERE

    Also a quick Google search turned up a similar algorithm that could be bent to your purpose HERE

    0 讨论(0)
  • 2021-02-02 05:06

    Recursion.

    function traverse(state) {
        handle(state.board);
        if (state.possibleMoves) {
            $.each(state.possibleMoves, function(i, possibleMove) {
                 traverse(possibleMove);
            });
        }
    }
    

    EDIT: For a breadth-first search, try something like this. It doesn't use recursion, but instead iterates over a growing queue.

    function traverse(state) {
        var queue = [],
            next = state;
        while (next) {
            if (next.possibleMoves) {
                $.each(next.possibleMoves, function(i, possibleMove) {
                    queue.push(possibleMove);
                });
            }
            next = queue.shift();
        }
    }
    
    0 讨论(0)
  • 2021-02-02 05:13

    Not completely tested:

    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);
    
    0 讨论(0)
提交回复
热议问题