JavaScript|LeetCode|搜索|130.被围绕的区域

法1:DFS
想法:
1.遍历四周字母,遍历到"O",以该"O"为起点,进行DFS,与该"O"相连的"O"做上标记(包括该"O")。
2.将标记了的位置设值"O",其他位置为"X"。
3.做标记方式:将原"O"设为"T"。
不找被围绕的区域,而找未被包围的区域。

/** * @param {character[][]} board * @return {void} Do not return anything, modify board in-place instead. */
var solve = function(board) {
    if(board.length == 0) {    
        return [];
    }    
    var i = 0, j = 0;    
    var row = board.length, column = board[0].length;
    for(i = 0; i < column; i++) { // 遍历上边界
        if(board[0][i] == 'X') {            
            continue;    
        }        
        else {
            dfs(board, 0, i);        
        }    
    }
    for(i = 0; i < row; i++) { // 遍历左边界
        if(board[i][0] == 'X') {
            continue;
        }        
        else {            
            dfs(board, i, 0);        
        }    
    }
    for(i = 0; i < column; i++) { // 遍历下边界
        if(board[row - 1][i] == 'X') {
            continue;        
        }        
        else {            
            dfs(board, row - 1, i);        
        }    
    }
    for(i = 0; i < row; i++) { // 遍历右边界
        if(board[i][column - 1] == 'X') {
            continue;        
        }        
        else {            
            dfs(board, i, column - 1);        
        }    
    }
    for(i = 0; i < row; i++) {        
        for(j = 0; j < column; j++) {            
            if(board[i][j] == 'T') {                
                board[i][j] = 'O';            
            }            
            else {                
                board[i][j] = 'X';            
            }        
        }    
    }
};

function dfs(board, r, c) {    
    if(r < 0 || r >= board.length || c < 0 || c >= board[0].length || board[r][c] != 'O') {        
        return 0;    
    }    
    board[r][c] = 'T';    
    var i = 0, j = 0;    

    // 遍历相邻节点
    for(i = -1; i < 2; i++) {        
        for(j = -1; j < 2; j++) {            
            if(i == j || i * j == -1) {                
                continue;            
            }            
            dfs(board, r + i, c + j);        
        }    
    }
}

注:参考了答案

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值