mirror of https://github.com/evanferrao/dsa
surrounded regions
This commit is contained in:
parent
ef83c1be47
commit
fdb2d87fb1
|
|
@ -0,0 +1,141 @@
|
|||
// https://leetcode.com/problems/surrounded-regions/
|
||||
|
||||
import java.util.*;
|
||||
import java.io.*;
|
||||
|
||||
class Main {
|
||||
|
||||
static class Node{
|
||||
int row;
|
||||
int col;
|
||||
|
||||
Node(int row, int col){
|
||||
this.row = row;
|
||||
this.col = col;
|
||||
}
|
||||
}
|
||||
|
||||
// DFS
|
||||
public static void dfs(Node node, char board[][], boolean doNotTouch[][]){
|
||||
|
||||
int m = board.length;
|
||||
int n = board[0].length;
|
||||
|
||||
int r = node.row;
|
||||
int c = node.col;
|
||||
|
||||
doNotTouch[r][c] = true;
|
||||
|
||||
int dr[] = {-1, 0, 1, 0};
|
||||
int dc[] = {0, 1, 0, -1};
|
||||
|
||||
for(int k=0;k<4;k++){
|
||||
int nr = r + dr[k];
|
||||
int nc = c + dc[k];
|
||||
|
||||
if(nr>=0 && nc>=0 && nr<m && nc<n &&
|
||||
!doNotTouch[nr][nc] && board[nr][nc]=='O'){
|
||||
dfs(new Node(nr, nc), board, doNotTouch);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// BFS
|
||||
public static void bfs(Node start, char board[][], boolean doNotTouch[][]){
|
||||
|
||||
int m = board.length;
|
||||
int n = board[0].length;
|
||||
|
||||
Queue<Node> q = new LinkedList<>();
|
||||
q.add(start);
|
||||
doNotTouch[start.row][start.col] = true;
|
||||
|
||||
int dr[] = {-1, 0, 1, 0};
|
||||
int dc[] = {0, 1, 0, -1};
|
||||
|
||||
while(!q.isEmpty()){
|
||||
Node cur = q.poll();
|
||||
|
||||
for(int k=0;k<4;k++){
|
||||
int nr = cur.row + dr[k];
|
||||
int nc = cur.col + dc[k];
|
||||
|
||||
if(nr>=0 && nc>=0 && nr<m && nc<n &&
|
||||
!doNotTouch[nr][nc] && board[nr][nc]=='O'){
|
||||
doNotTouch[nr][nc] = true;
|
||||
q.add(new Node(nr, nc));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public static void solve(char board[][]){
|
||||
|
||||
int m = board.length;
|
||||
int n = board[0].length;
|
||||
|
||||
boolean doNotTouch[][] = new boolean[m][n];
|
||||
|
||||
// borders
|
||||
for(int i=0;i<m;i++){
|
||||
if(board[i][0]=='O'){
|
||||
dfs(new Node(i,0), board, doNotTouch);
|
||||
// bfs(new Node(i,0), board, doNotTouch);
|
||||
}
|
||||
if(board[i][n-1]=='O'){
|
||||
dfs(new Node(i,n-1), board, doNotTouch);
|
||||
// bfs(new Node(i,n-1), board, doNotTouch);
|
||||
}
|
||||
}
|
||||
|
||||
for(int j=0;j<n;j++){
|
||||
if(board[0][j]=='O'){
|
||||
dfs(new Node(0,j), board, doNotTouch);
|
||||
// bfs(new Node(0,j), board, doNotTouch);
|
||||
}
|
||||
if(board[m-1][j]=='O'){
|
||||
dfs(new Node(m-1,j), board, doNotTouch);
|
||||
// bfs(new Node(m-1,j), board, doNotTouch);
|
||||
}
|
||||
}
|
||||
|
||||
char finalAns[][] = new char[m][n];
|
||||
|
||||
for(int i=0;i<m;i++){
|
||||
for(int j=0;j<n;j++){
|
||||
if(doNotTouch[i][j]) finalAns[i][j] = board[i][j];
|
||||
else finalAns[i][j] = 'X';
|
||||
}
|
||||
}
|
||||
|
||||
// copy back
|
||||
for(int i=0;i<m;i++){
|
||||
for(int j=0;j<n;j++){
|
||||
board[i][j] = finalAns[i][j];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// DRIVER
|
||||
public static void main(String args[]){
|
||||
|
||||
char board[][] = {
|
||||
{'X','X','X','X'},
|
||||
{'X','O','O','X'},
|
||||
{'X','X','O','X'},
|
||||
{'X','O','X','X'}
|
||||
};
|
||||
|
||||
solve(board);
|
||||
|
||||
for(int i=0;i<board.length;i++){
|
||||
for(int j=0;j<board[0].length;j++){
|
||||
System.out.printf("%c ", board[i][j]);
|
||||
}
|
||||
System.out.printf("\n");
|
||||
}
|
||||
}
|
||||
}
|
||||
Loading…
Reference in New Issue