# 题目

给定二维数组中两个元素
找出连通两个元素的最短路径

# 测试用例

// 给定数组 0可以通行 1不可以通行
var origin = [
            [0,0,1,0],
            [0,0,1,0],
            [0,0,1,0],
            [0,0,0,0]
        ];

var start = [0,0];

var end = [0,3];

# 代码

var origin = [
    [0,0,1,0,0],
    [0,0,1,0,1],
    [0,0,1,0,0],
    [0,0,0,0,1]
];

// 起始点
var start = [1,1];
// 终止点
var end = [2,4];

// 起始过的点集合
var visited = [];
// 走过的路径集合
var prev = [];

/*迷宫走路*/
function search(a,b) {
    var queue = [];
    queue.push(a);

    var result = null;
    visited.push(a);
    prev.push({
        x: a[0],
        y: a[1],
        prev: null
    });

    while (queue.length > 0){
        var item = queue.splice(0,1);
        item = item[0];

        if(origin[item[0]][item[1]] == 1){
            continue;
        }
        
        if(item[0] == end[0] && item[1] == end[1]) {
            break;
        }

        var left = {
            x: item[0] - 1,
            y: item[1]
        };
        var right = {
            x: item[0] + 1,
            y: item[1]
        };
        var top = {
            x: item[0],
            y: item[1] - 1
        };
        var bottom = {
            x: item[0],
            y: item[1] + 1
        };

        var direction = [];
        direction.push(left);
        direction.push(right);
        direction.push(top);
        direction.push(bottom);
        
        var maxX = origin.length;
        var maxY = origin[0].length;
        $isbreak = false;
        for(var len = direction.length , i = len - 1 ; i >= 0 ; --i ){
            if(direction[i].x >= 0 && direction[i].x < maxX && direction[i].y >= 0 && direction[i].y < maxY){//坐标未溢出
                if(!checkVisited(direction[i])){
                    visited.push([direction[i].x,direction[i].y]);

                    var obj = {
                        x: direction[i].x,
                        y: direction[i].y,
                        prev: null
                    }

                    for(var l = prev.length , j = l - 1; j >= 0 ; --j){
                        if(prev[j].x == item[0] && prev[j].y == item[1]){
                            obj.prev = prev[j];
                            break;
                        }
                    }

                    prev.push(obj);
                    
                    if(obj.x == end[0] && obj.y == end[1]) {
                        $isbreak = true;
                        break;
                    }
                    
                    queue.push([direction[i].x,direction[i].y]);
                }

            }
        }
        if ($isbreak) break;
    }

}

function checkVisited(obj) {
    for(var l = visited.length , j = l - 1 ; j >= 0 ; --j){
        if(obj.x == visited[j][0] && obj.y == visited[j][1]){
            return true;
        }
    }

    return false;
}

var r = search(start,end);

// 输出走过的最短路径
function checkPrev(p) {
    while (p.prev){
        console.log(p.x,p.y);
        p = p.prev;
    }

    console.log(p.x,p.y);
}

checkPrev(prev[prev.length - 1]);

# 验证

checkPrev(prev[prev.length - 1]);