首页 > 试题广场 >

被围绕的区域

[编程题]被围绕的区域
  • 热度指数:2246 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
给定一个 n*m 大小的的矩阵,矩阵中由 ‘X' 和 'O' 构成,找到所有被 'X' 围绕的区域,并将其用 'X' 填充。

例如:
[['X','X','X','X'],
['X','O','O','X'],
['X','O','X','X'],
['X','X','O','X']]
中间的三个 ‘O’ 被 'X'围绕,因此将其填充为 'X' ,但第四行的 'O' 下方没有被 'X' 围绕,因此不改变,结果为
[['X','X','X','X'],
['X','X','X','X'],
['X','X','X','X'],
['X','X','O','X']]

数据范围: ,矩阵中保证只含有 'X' 和 'O'
示例1

输入

[[X,X,X,X],[X,O,O,X],[X,O,X,X],[X,X,O,X]]

输出

[[X,X,X,X],[X,X,X,X],[X,X,X,X],[X,X,O,X]]
示例2

输入

[[O]]

输出

[[O]]

备注:

package main
import _"fmt"

/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 * 
 * @param board char字符型二维数组 
 * @return char字符型二维数组
*/
func surroundedArea( board [][]byte ) [][]byte {
    n,m:=len(board),len(board[0])
    var dfs func(int,int)
    dfs=func(i,j int){
        if i<0||i>=n||j<0||j>=m||board[i][j]!='O'{
            return
        }
        board[i][j]='y'
        dfs(i+1,j)
        dfs(i-1,j)
        dfs(i,j+1)
        dfs(i,j-1)
    }
    for i:=0;i<m;i++{
        if board[0][i]=='O'{
            dfs(0,i)
        }
        if board[n-1][i]=='O'{
            dfs(n-1,i)
        }
    }
    for i:=0;i<n;i++{
        if board[i][0]=='O'{
            dfs(i,0)
        }
        if board[i][m-1]=='O'{
            dfs(i,m-1)
        }
    }
    for i:=0;i<n;i++{
        for j:=0;j<m;j++{
            if board[i][j]=='O'{
                board[i][j]='X'
            }
        }
    }
    for i:=0;i<n;i++{
        for j:=0;j<m;j++{
            if board[i][j]=='y'{
                board[i][j]='O'
            }
        }
    }
    return board
}

发表于 2023-03-08 21:01:56 回复(0)
BFS内存超限了。。。
package main

/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 * 
 * @param board char字符型二维数组 
 * @return char字符型二维数组
*/
func surroundedArea(board [][]byte) [][]byte {
	// write code here
	n := len(board)
	m := len(board[0])

	for i := 0; i < n; i++ {
		for j := 0; j < m; j++ {
			if board[i][j] == 'O' {
				bfs(&board, i, j, n, m)
			}
		}
	}

	return board
}

func bfs(board *[][]byte, x, y int, n, m int) {
	queue := [][2]int{{x, y}} // 初始化把当前坐标加入队列
	currentO := [][2]int{}

	for len(queue) > 0 {
		front := queue[0]
		currentO = append(currentO, front)
		queue = queue[1:]
		i, j := front[0], front[1]
		(*board)[i][j] = 'T'
		if i-1 >= 0 && (*board)[i-1][j] == 'O' {
			queue = append(queue, [2]int{i - 1, j})
		}
		if i+1 < n && (*board)[i+1][j] == 'O' {
			queue = append(queue, [2]int{i + 1, j})
		}
		if j-1 >= 0 && (*board)[i][j-1] == 'O' {
			queue = append(queue, [2]int{i, j - 1})
		}
		if j+1 < m && (*board)[i][j+1] == 'O' {
			queue = append(queue, [2]int{i, j + 1})
		}
	}
	canChange := true
	for i := 0; i < len(currentO); i++ {
		if currentO[i][0] == 0 || currentO[i][0] == n-1 || currentO[i][1] == 0 || currentO[i][1] == m-1 {
			canChange = false
		}
	}
	if canChange {
		for i := 0; i < len(currentO); i++ {
			(*board)[currentO[i][0]][currentO[i][1]] = 'X'
		}
	} else {
		for i := 0; i < len(currentO); i++ {
			(*board)[currentO[i][0]][currentO[i][1]] = 'O'
		}
	}
}

发表于 2022-09-01 11:49:05 回复(0)

问题信息

难度:
2条回答 2401浏览

热门推荐

通过挑战的用户

查看代码