编辑代码

function getEmptyArea(r,c,arr){
    let entryXY= []
    for(let x = 0;x<c;x++){
        for(let y = 0;y<r;y++){
            if(y === 0 || y === r-1 || x === 0 ||x === c-1){//边缘节点
                //等于o为入口
                if((arr[y] && arr[y].split('')[x]) === 'o'){
                    entryXY.push([x,y])
                }
            }
        }
    }
    let areaArr =[]
    let allArea=[]
    for(let i = 0; i<entryXY.length ; i++){ //遍历入口计算各自的区域大小
        let relateX = []
        relateX.push(entryXY[i])
        let n = 0
        for(let x= 0 ; x<relateX.length ; x++){
            let newNode = getEmptyItem(arr,relateX[x][0],relateX[x][1],c,r)
            if(newNode && newNode.length>0){
                for(let z = 0 ;z<newNode.length ; z++){
                    let isRepate = relateX.filter((item)=>{return item[0] === newNode[z][0] && item[1] === newNode[z][1]})
                    if(isRepate === undefined ||isRepate.length<=0){
                        relateX.push(newNode[z])
                    }
                }
                
            }

        }
        allArea.push(relateX)
    }
    console.log('空区域:'+JSON.stringify(allArea))

    //选择单入口
    let newArea=[]
    if(allArea && allArea.length>0){
        for(let entryTime = 0;entryTime<allArea.length;entryTime++){
            let areaMsg = allArea[entryTime]
            let entryNumber = 0
            for(let cell = 0;cell<areaMsg.length;cell++){
                if(areaMsg[cell][1] === 0 || areaMsg[cell][1] === r-1 || areaMsg[cell][0] === 0 ||areaMsg[cell][0] === c-1){
                    entryNumber++
                }
            }
            if(entryNumber <=1){
                newArea.push(areaMsg)
            }
        }  
        // if(newArea.length>1){
        //     newArea.sort(function(a,b){
        //         return a[0][0]-b[0][0] ||a[0][1]-b[0][1] 
        //     })          
        // }
    }

    //最大区域过滤
    newArea.sort(function (a,b){a.length-b.length})


    console.log("--------------------------------")
    console.log("排序后的单入口区域"+newArea)
    if(newArea && newArea.length>0 ){
        for(let z=0;z<newArea.length;z++){
            if(newArea[z][0].length === newArea[0][0].length){
            console.log("最大单入口区域开始行坐标:" + newArea[z][0][1]+"入口列坐标:"+newArea[z][0][0]+"区域大小"+newArea[z].length)
            }
        }
    }else{
        console.log("不存在最大单入口区域")
    }
}
//获取周围空节点
function getEmptyItem (arr,x,y,c,r){
    let emptyItem = []
    if(0<(x+1)<c){ //x right
        let nodeMsg = arr[y]
        let row = nodeMsg ?nodeMsg.split(''):[]
        if(row[x+1] === 'o'){
            emptyItem.push([x+1,y])
        } 
    }
    if(0<(x-1)<c){ //x left
        let nodeMsg = arr[y]
        let row = nodeMsg ?nodeMsg.split(''):[]
        if(row[x-1] === 'o'){
            emptyItem.push([x-1,y])
        } 
    }

    if(0<(y+1)<r && y< arr.length ){ //y bottom
        let nodeMsg = arr[y+1]
        let row = nodeMsg ?nodeMsg.split(''):[]
        if(row[x] === 'o'){
            emptyItem.push([x,y+1])
        } 
    }
    if(0<(y-1)<r && y-1< arr.length){ //y top
        let nodeMsg = arr[y-1]
        let row = nodeMsg ?nodeMsg.split(''):[]
        if(row[x] === 'o'){
            emptyItem.push([x,y-1])
        } 
    }
    return emptyItem
}
// getEmptyArea(4,4,['xxxx','xoox','xoox','xoxx'])
// getEmptyArea(4,5,['xxxxx','oooox','xooox','xoxxo'])
// getEmptyArea(5,4,['xxxx','xooo','xooo','xoox','xxxx'])
getEmptyArea(5,4,['xxxx','xooo','xxxx','xooo','xxxx'])