mirror of https://github.com/evanferrao/dsa
142 lines
3.4 KiB
Java
142 lines
3.4 KiB
Java
// 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");
|
|
}
|
|
}
|
|
}
|