Surrounded Regions
The "Surrounded Regions" problem involves identifying regions in a given matrix where all 'O' elements are surrounded by 'X' elements. The objective is to modify the matrix by replacing those surrounded 'O' elements with 'X'.
Problem Statement
Given a matrix of size R x C, where each element can be either 'X' or 'O', we need to modify the matrix such that all 'O' elements that are surrounded by 'X' are changed to 'X'. An 'O' element is considered surrounded if it is not on the boundary of the matrix and all its adjacent elements (top, bottom, left, and right) are 'X'.
For example, consider the following matrix:
O X X X X O X X X X X O X O O O O X X O O X O X X X X X X X O X X X X X O X X X X X X X O O X O O X X O X O X O
After modifying the matrix, the result should be:
O X X X X O X X X X X X X O O O O X X O O X O X X X X X X X X X X X X X X X X X X X X X O O X O O X X O X O X O
The surrounded 'O' elements in the matrix have been replaced with 'X', while the elements on the boundaries remain unchanged.
Explanation
The problem can be solved by performing a depth-first search (DFS) or breadth-first search (BFS) traversal of the matrix.
First, we iterate through the matrix and replace all 'O' elements with a different symbol, such as '+', to mark them for later processing. This is done to avoid modifying 'O' elements that are not surrounded by 'X'.
Next, we traverse the boundary of the matrix and perform a DFS or BFS from each 'O' element found on the boundary. During the traversal, we recursively visit adjacent elements and change them to 'O'. This ensures that all elements connected to the boundary 'O' elements are marked as not surrounded by 'X'.
After the traversal is complete, all remaining '+' elements are the ones that were originally surrounded by 'X'. We replace them with 'X' to achieve the desired result.
Pseudocode Algorithm
function fill(record, i, j): if i < 0 or i >= R or j < 0 or j >= C: return if record[i][j] == '+': record[i][j] = 'O' fill(record, i + 1, j) fill(record, i - 1, j) fill(record, i, j + 1) fill(record, i, j - 1) function solve(record): for i from 0 to R: for j from 0 to C: if record[i][j] == 'O': record[i][j] = '+' for i from 0 to R: if record[i][0] == '+': fill(record, i, 0) if record[i][C-1] == '+': fill(record, i, C-1) for i from 0 to C: if record[0][i] == '+': fill(record, 0, i) if record[R-1][i] == '+': fill(record, R-1, i) for i from 0 to R: for j from 0 to C: if record[i][j] == '+': record[i][j] = 'X' record = [ ['O', 'X', 'X', 'X', 'X', 'O', 'X'], ['X', 'X', 'X', 'X', 'O', 'X', 'O'], ['O', 'O', 'O', 'X', 'X', 'O', 'O'], ['X', 'O', 'X', 'X', 'X', 'X', 'X'], ['X', 'X', 'O', 'X', 'X', 'X', 'X'], ['X', 'O', 'X', 'X', 'X', 'X', 'X'], ['X', 'X', 'O', 'O', 'X', 'O', 'O'], ['X', 'X', 'O', 'X', 'O', 'X', 'O'], ] solve(record)
Code Solution
/*
C Program for
Surrounded Regions
*/
#include <stdio.h>
#define R 8
#define C 7
// Print record elements
void printResult(char record[R][C])
{
for (int i = 0; i < R; ++i)
{
for (int j = 0; j < C; ++j)
{
printf(" %c",record[i][j]);
}
printf("\n");
}
}
// Fill corner elements with a "O" value
void fill(char record[R][C],int i, int j)
{
if(i < 0 || i >= R || j < 0 || j >= C)
{
return;
}
if(record[i][j] == '+')
{
// Update element
record[i][j] = 'O';
// visit to down element
fill(record,i+1,j);
// visit to up element
fill(record,i-1,j);
// visit to right element
fill(record,i,j+1);
// visit to left element
fill(record,i,j-1);
}
}
// Fill surrounded regions
void solve(char record[R][C])
{
// loop controlling variables
int i = 0;
int j = 0;
printf("\n Before Surrounded \n");
printResult(record);
// First change the all zero with other symbol "+"
for ( i = 0; i < R; ++i)
{
for ( j = 0; j < C; ++j)
{
if(record[i][j]=='O')
{
record[i][j] = '+';
}
}
}
// Change boundary
// Check first and last column
for ( i = 0; i < R; ++i)
{
if(record[i][0] == '+')
{
fill(record,i,0);
}
if(record[i][C-1]=='+')
{
fill(record,i,C-1);
}
}
// Check first and last row
for ( i = 0; i < C; ++i)
{
if(record[0][i] == '+')
{
fill(record,0,i);
}
if(record[R-1][i]=='+')
{
fill(record,R-1,i);
}
}
for ( i = 0; i < R; ++i)
{
for ( j = 0; j < C; ++j)
{
if(record[i][j]=='+')
{
record[i][j] = 'X';
}
}
}
printf("\n After Surrounded \n");
printResult(record);
}
int main()
{
char record[R][C] =
{
{'O', 'X', 'X', 'X', 'X', 'O', 'X'},
{'X', 'X', 'X', 'X', 'O', 'X', 'O'},
{'O', 'O', 'O', 'X', 'X', 'O', 'O'},
{'X', 'O', 'X', 'X', 'X', 'X', 'X'},
{'X', 'X', 'O', 'X', 'X', 'X', 'X'},
{'X', 'O', 'X', 'X', 'X', 'X', 'X'},
{'X', 'X', 'O', 'O', 'X', 'O', 'O'},
{'X', 'X', 'O', 'X', 'O', 'X', 'O'},
};
/*
Change all O with X when O is Surrounded by X
Example
========
// Left,Right, Bottom and Top are have X
X X
X O O X
X X
Then change center O with X
X X
X X X X
X X
-----------------------------
or
X
X O X
X
Then change center O with X
X
X O X
X
*/
solve(record);
return 0;
}
Output
Before Surrounded
O X X X X O X
X X X X O X O
O O O X X O O
X O X X X X X
X X O X X X X
X O X X X X X
X X O O X O O
X X O X O X O
After Surrounded
O X X X X O X
X X X X X X O
O O O X X O O
X O X X X X X
X X X X X X X
X X X X X X X
X X O O X O O
X X O X O X O
/*
Java Program for
surrounded regions
*/
public class Regions
{
// Print record elements
public void printresult(char[][] record, int r, int c)
{
for (int i = 0; i < r; ++i)
{
for (int j = 0; j < c; ++j)
{
System.out.print(" " + record[i][j]);
}
System.out.print("\n");
}
}
// Fill corner elements with a "O" value
public void fill(char[][] record, int i, int j, int r, int c)
{
if (i < 0 || i >= r || j < 0 || j >= c)
{
return;
}
if (record[i][j] == '+')
{
// Update element
record[i][j] = 'O';
// visit to down element
fill(record, i + 1, j, r, c);
// visit to up element
fill(record, i - 1, j, r, c);
// visit to right element
fill(record, i, j + 1, r, c);
// visit to left element
fill(record, i, j - 1, r, c);
}
}
// Fill surrounded regions
public void solve(char[][] record)
{
// loop controlling variables
int i = 0;
int j = 0;
int r = record.length;
int c = record[0].length;
System.out.print("\n Before Surrounded \n");
printresult(record, r, c);
// First change the all zero with other symbol "+"
for (i = 0; i < r; ++i)
{
for (j = 0; j < c; ++j)
{
if (record[i][j] == 'O')
{
record[i][j] = '+';
}
}
}
// change boundary
// check first and last column
for (i = 0; i < r; ++i)
{
if (record[i][0] == '+')
{
fill(record, i, 0, r, c);
}
if (record[i][c - 1] == '+')
{
fill(record, i, c - 1, r, c);
}
}
// check first and last row
for (i = 0; i < c; ++i)
{
if (record[0][i] == '+')
{
fill(record, 0, i, r, c);
}
if (record[r - 1][i] == '+')
{
fill(record, r - 1, i, r, c);
}
}
for (i = 0; i < r; ++i)
{
for (j = 0; j < c; ++j)
{
if (record[i][j] == '+')
{
record[i][j] = 'X';
}
}
}
System.out.print("\n After Surrounded \n");
printresult(record, r, c);
}
public static void main(String[] args)
{
Regions task = new Regions();
char [][]record =
{
{'O', 'X', 'X', 'X', 'X', 'O', 'X'},
{'X', 'X', 'X', 'X', 'O', 'X', 'O'},
{'O', 'O', 'O', 'X', 'X', 'O', 'O'},
{'X', 'O', 'X', 'X', 'X', 'X', 'X'},
{'X', 'X', 'O', 'X', 'X', 'X', 'X'},
{'X', 'O', 'X', 'X', 'X', 'X', 'X'},
{'X', 'X', 'O', 'O', 'X', 'O', 'O'},
{'X', 'X', 'O', 'X', 'O', 'X', 'O'},
};
/*
Change all O with X when O is Surrounded by X
Example
========
// Left,right, Bottom and Top are have X
X X
X O O X
X X
Then change center O with X
X X
X X X X
X X
-----------------------------
or
X
X O X
X
Then change center O with X
X
X O X
X
*/
task.solve(record);
}
}
Output
Before Surrounded
O X X X X O X
X X X X O X O
O O O X X O O
X O X X X X X
X X O X X X X
X O X X X X X
X X O O X O O
X X O X O X O
After Surrounded
O X X X X O X
X X X X X X O
O O O X X O O
X O X X X X X
X X X X X X X
X X X X X X X
X X O O X O O
X X O X O X O
// Include header file
#include <iostream>
#define R 8
#define C 7
using namespace std;
/*
C++ Program for
surrounded regions
*/
class Regions
{
public:
// Print record elements
void printresult(char record[R][C])
{
for (int i = 0; i < R; ++i)
{
for (int j = 0; j < C; ++j)
{
cout << " " << record[i][j];
}
cout << "\n";
}
}
// Fill corner elements with a "O" value
void fill(char record[R][C], int i, int j)
{
if (i < 0 || i >= R || j < 0 || j >= C)
{
return;
}
if (record[i][j] == '+')
{
// Update element
record[i][j] = 'O';
// visit to down element
this->fill(record, i + 1, j);
// visit to up element
this->fill(record, i - 1, j);
// visit to right element
this->fill(record, i, j + 1);
// visit to left element
this->fill(record, i, j - 1);
}
}
// Fill surrounded regions
void solve(char record[R][C])
{
// loop controlling variables
int i = 0;
int j = 0;
cout << "\n Before Surrounded \n";
this->printresult(record);
// First change the all zero with other symbol "+"
for (i = 0; i < R; ++i)
{
for (j = 0; j < C; ++j)
{
if (record[i][j] == 'O')
{
record[i][j] = '+';
}
}
}
// change boundary
// check first and last column
for (i = 0; i < R; ++i)
{
if (record[i][0] == '+')
{
this->fill(record, i, 0);
}
if (record[i][C - 1] == '+')
{
this->fill(record, i, C - 1);
}
}
// check first and last row
for (i = 0; i < C; ++i)
{
if (record[0][i] == '+')
{
this->fill(record, 0, i);
}
if (record[R - 1][i] == '+')
{
this->fill(record, R - 1, i);
}
}
for (i = 0; i < R; ++i)
{
for (j = 0; j < C; ++j)
{
if (record[i][j] == '+')
{
record[i][j] = 'X';
}
}
}
cout << "\n After Surrounded \n";
this->printresult(record);
}
};
int main()
{
Regions task = Regions();
char record[R][C] =
{
{'O', 'X', 'X', 'X', 'X', 'O', 'X'},
{'X', 'X', 'X', 'X', 'O', 'X', 'O'},
{'O', 'O', 'O', 'X', 'X', 'O', 'O'},
{'X', 'O', 'X', 'X', 'X', 'X', 'X'},
{'X', 'X', 'O', 'X', 'X', 'X', 'X'},
{'X', 'O', 'X', 'X', 'X', 'X', 'X'},
{'X', 'X', 'O', 'O', 'X', 'O', 'O'},
{'X', 'X', 'O', 'X', 'O', 'X', 'O'},
};
/*
Change all O with X when O is Surrounded by X
Example
========
// Left,right, Bottom and Top are have X
X X
X O O X
X X
Then change center O with X
X X
X X X X
X X
-----------------------------
or
X
X O X
X
Then change center O with X
X
X O X
X
*/
task.solve(record);
return 0;
}
Output
Before Surrounded
O X X X X O X
X X X X O X O
O O O X X O O
X O X X X X X
X X O X X X X
X O X X X X X
X X O O X O O
X X O X O X O
After Surrounded
O X X X X O X
X X X X X X O
O O O X X O O
X O X X X X X
X X X X X X X
X X X X X X X
X X O O X O O
X X O X O X O
// Include namespace system
using System;
/*
C# Program for
surrounded regions
*/
public class Regions
{
// Print record elements
public void printresult(char[,] record, int r, int c)
{
for (int i = 0; i < r; ++i)
{
for (int j = 0; j < c; ++j)
{
Console.Write(" " + record[i,j]);
}
Console.Write("\n");
}
}
// Fill corner elements with a "O" value
public void fill(char[,] record, int i, int j, int r, int c)
{
if (i < 0 || i >= r || j < 0 || j >= c)
{
return;
}
if (record[i,j] == '+')
{
// Update element
record[i,j] = 'O';
// visit to down element
fill(record, i + 1, j, r, c);
// visit to up element
fill(record, i - 1, j, r, c);
// visit to right element
fill(record, i, j + 1, r, c);
// visit to left element
fill(record, i, j - 1, r, c);
}
}
// Fill surrounded regions
public void solve(char[,] record)
{
// loop controlling variables
int i = 0;
int j = 0;
int r = record.GetLength(0);
int c = record.GetLength(1);
Console.Write("\n Before Surrounded \n");
printresult(record, r, c);
// First change the all zero with other symbol "+"
for (i = 0; i < r; ++i)
{
for (j = 0; j < c; ++j)
{
if (record[i,j] == 'O')
{
record[i,j] = '+';
}
}
}
// change boundary
// check first and last column
for (i = 0; i < r; ++i)
{
if (record[i,0] == '+')
{
fill(record, i, 0, r, c);
}
if (record[i,c - 1] == '+')
{
fill(record, i, c - 1, r, c);
}
}
// check first and last row
for (i = 0; i < c; ++i)
{
if (record[0,i] == '+')
{
fill(record, 0, i, r, c);
}
if (record[r - 1,i] == '+')
{
fill(record, r - 1, i, r, c);
}
}
for (i = 0; i < r; ++i)
{
for (j = 0; j < c; ++j)
{
if (record[i,j] == '+')
{
record[i,j] = 'X';
}
}
}
Console.Write("\n After Surrounded \n");
printresult(record, r, c);
}
public static void Main(String[] args)
{
Regions task = new Regions();
char[,] record =
{
{'O', 'X', 'X', 'X', 'X', 'O', 'X'},
{'X', 'X', 'X', 'X', 'O', 'X', 'O'},
{'O', 'O', 'O', 'X', 'X', 'O', 'O'},
{'X', 'O', 'X', 'X', 'X', 'X', 'X'},
{'X', 'X', 'O', 'X', 'X', 'X', 'X'},
{'X', 'O', 'X', 'X', 'X', 'X', 'X'},
{'X', 'X', 'O', 'O', 'X', 'O', 'O'},
{'X', 'X', 'O', 'X', 'O', 'X', 'O'}
};
/*
Change all O with X when O is Surrounded by X
Example
========
// Left,right, Bottom and Top are have X
X X
X O O X
X X
Then change center O with X
X X
X X X X
X X
-----------------------------
or
X
X O X
X
Then change center O with X
X
X O X
X
*/
task.solve(record);
}
}
Output
Before Surrounded
O X X X X O X
X X X X O X O
O O O X X O O
X O X X X X X
X X O X X X X
X O X X X X X
X X O O X O O
X X O X O X O
After Surrounded
O X X X X O X
X X X X X X O
O O O X X O O
X O X X X X X
X X X X X X X
X X X X X X X
X X O O X O O
X X O X O X O
<?php
/*
Php Program for
surrounded regions
*/
class Regions
{
// Print record elements
public function printresult( & $record, $r, $c)
{
for ($i = 0; $i < $r; ++$i)
{
for ($j = 0; $j < $c; ++$j)
{
echo " ". $record[$i][$j];
}
echo "\n";
}
}
// Fill corner elements with a "O" value
public function fill( & $record, $i, $j, $r, $c)
{
if ($i < 0 || $i >= $r || $j < 0 || $j >= $c)
{
return;
}
if ($record[$i][$j] == '+')
{
// Update element
$record[$i][$j] = 'O';
// visit to down element
$this->fill($record, $i + 1, $j, $r, $c);
// visit to up element
$this->fill($record, $i - 1, $j, $r, $c);
// visit to right element
$this->fill($record, $i, $j + 1, $r, $c);
// visit to left element
$this->fill($record, $i, $j - 1, $r, $c);
}
}
// Fill surrounded regions
public function solve( & $record)
{
// loop controlling variables
$i = 0;
$j = 0;
$r = count($record);
$c = count($record[0]);
echo "\n Before Surrounded \n";
$this->printresult($record, $r, $c);
// First change the all zero with other symbol "+"
for ($i = 0; $i < $r; ++$i)
{
for ($j = 0; $j < $c; ++$j)
{
if ($record[$i][$j] == 'O')
{
$record[$i][$j] = '+';
}
}
}
// change boundary
// check first and last column
for ($i = 0; $i < $r; ++$i)
{
if ($record[$i][0] == '+')
{
$this->fill($record, $i, 0, $r, $c);
}
if ($record[$i][$c - 1] == '+')
{
$this->fill($record, $i, $c - 1, $r, $c);
}
}
// check first and last row
for ($i = 0; $i < $c; ++$i)
{
if ($record[0][$i] == '+')
{
$this->fill($record, 0, $i, $r, $c);
}
if ($record[$r - 1][$i] == '+')
{
$this->fill($record, $r - 1, $i, $r, $c);
}
}
for ($i = 0; $i < $r; ++$i)
{
for ($j = 0; $j < $c; ++$j)
{
if ($record[$i][$j] == '+')
{
$record[$i][$j] = 'X';
}
}
}
echo "\n After Surrounded \n";
$this->printresult($record, $r, $c);
}
}
function main()
{
$task = new Regions();
$record = array(
array('O', 'X', 'X', 'X', 'X', 'O', 'X'),
array('X', 'X', 'X', 'X', 'O', 'X', 'O'),
array('O', 'O', 'O', 'X', 'X', 'O', 'O'),
array('X', 'O', 'X', 'X', 'X', 'X', 'X'),
array('X', 'X', 'O', 'X', 'X', 'X', 'X'),
array('X', 'O', 'X', 'X', 'X', 'X', 'X'),
array('X', 'X', 'O', 'O', 'X', 'O', 'O'),
array('X', 'X', 'O', 'X', 'O', 'X', 'O')
);
/*
Change all O with X when O is Surrounded by X
Example
========
// Left,right, Bottom and Top are have X
X X
X O O X
X X
Then change center O with X
X X
X X X X
X X
-----------------------------
or
X
X O X
X
Then change center O with X
X
X O X
X
*/
$task->solve($record);
}
main();
Output
Before Surrounded
O X X X X O X
X X X X O X O
O O O X X O O
X O X X X X X
X X O X X X X
X O X X X X X
X X O O X O O
X X O X O X O
After Surrounded
O X X X X O X
X X X X X X O
O O O X X O O
X O X X X X X
X X X X X X X
X X X X X X X
X X O O X O O
X X O X O X O
/*
Node Js Program for
surrounded regions
*/
class Regions
{
// Print record elements
printresult(record, r, c)
{
for (var i = 0; i < r; ++i)
{
for (var j = 0; j < c; ++j)
{
process.stdout.write(" " + record[i][j]);
}
process.stdout.write("\n");
}
}
// Fill corner elements with a "O" value
fill(record, i, j, r, c)
{
if (i < 0 || i >= r || j < 0 || j >= c)
{
return;
}
if (record[i][j] == '+')
{
// Update element
record[i][j] = 'O';
// visit to down element
this.fill(record, i + 1, j, r, c);
// visit to up element
this.fill(record, i - 1, j, r, c);
// visit to right element
this.fill(record, i, j + 1, r, c);
// visit to left element
this.fill(record, i, j - 1, r, c);
}
}
// Fill surrounded regions
solve(record)
{
// loop controlling variables
var i = 0;
var j = 0;
var r = record.length;
var c = record[0].length;
process.stdout.write("\n Before Surrounded \n");
this.printresult(record, r, c);
// First change the all zero with other symbol "+"
for (i = 0; i < r; ++i)
{
for (j = 0; j < c; ++j)
{
if (record[i][j] == 'O')
{
record[i][j] = '+';
}
}
}
// change boundary
// check first and last column
for (i = 0; i < r; ++i)
{
if (record[i][0] == '+')
{
this.fill(record, i, 0, r, c);
}
if (record[i][c - 1] == '+')
{
this.fill(record, i, c - 1, r, c);
}
}
// check first and last row
for (i = 0; i < c; ++i)
{
if (record[0][i] == '+')
{
this.fill(record, 0, i, r, c);
}
if (record[r - 1][i] == '+')
{
this.fill(record, r - 1, i, r, c);
}
}
for (i = 0; i < r; ++i)
{
for (j = 0; j < c; ++j)
{
if (record[i][j] == '+')
{
record[i][j] = 'X';
}
}
}
process.stdout.write("\n After Surrounded \n");
this.printresult(record, r, c);
}
}
function main()
{
var task = new Regions();
var record = [
['O', 'X', 'X', 'X', 'X', 'O', 'X'] ,
['X', 'X', 'X', 'X', 'O', 'X', 'O'] ,
['O', 'O', 'O', 'X', 'X', 'O', 'O'] ,
['X', 'O', 'X', 'X', 'X', 'X', 'X'] ,
['X', 'X', 'O', 'X', 'X', 'X', 'X'] ,
['X', 'O', 'X', 'X', 'X', 'X', 'X'] ,
['X', 'X', 'O', 'O', 'X', 'O', 'O'] ,
['X', 'X', 'O', 'X', 'O', 'X', 'O']
];
/*
Change all O with X when O is Surrounded by X
Example
========
// Left,right, Bottom and Top are have X
X X
X O O X
X X
Then change center O with X
X X
X X X X
X X
-----------------------------
or
X
X O X
X
Then change center O with X
X
X O X
X
*/
task.solve(record);
}
main();
Output
Before Surrounded
O X X X X O X
X X X X O X O
O O O X X O O
X O X X X X X
X X O X X X X
X O X X X X X
X X O O X O O
X X O X O X O
After Surrounded
O X X X X O X
X X X X X X O
O O O X X O O
X O X X X X X
X X X X X X X
X X X X X X X
X X O O X O O
X X O X O X O
# Python 3 Program for
# surrounded regions
class Regions :
# Print record elements
def printresult(self, record, r, c) :
i = 0
j = 0
while (i < r) :
while (j < c) :
print(" ", record[i][j], end = "")
j += 1
print(end = "\n")
i += 1
j = 0
# Fill corner elements with a "O" value
def fill(self, record, i, j, r, c) :
if (i < 0 or i >= r or j < 0 or j >= c) :
return
if (record[i][j] == '+') :
# Update element
record[i][j] = 'O'
# visit to down element
self.fill(record, i + 1, j, r, c)
# visit to up element
self.fill(record, i - 1, j, r, c)
# visit to right element
self.fill(record, i, j + 1, r, c)
# visit to left element
self.fill(record, i, j - 1, r, c)
# Fill surrounded regions
def solve(self, record) :
# loop controlling variables
i = 0
j = 0
r = len(record)
c = len(record[0])
print("\n Before Surrounded ")
self.printresult(record, r, c)
# First change the all zero with other symbol "+"
while (i < r) :
while (j < c) :
if (record[i][j] == 'O') :
record[i][j] = '+'
j += 1
i += 1
j = 0
# change boundary
# check first and last column
i = 0
while (i < r) :
if (record[i][0] == '+') :
self.fill(record, i, 0, r, c)
if (record[i][c - 1] == '+') :
self.fill(record, i, c - 1, r, c)
i += 1
# check first and last row
i = 0
while (i < c) :
if (record[0][i] == '+') :
self.fill(record, 0, i, r, c)
if (record[r - 1][i] == '+') :
self.fill(record, r - 1, i, r, c)
i += 1
i = 0
while (i < r) :
j = 0
while (j < c) :
if (record[i][j] == '+') :
record[i][j] = 'X'
j += 1
i += 1
print("\n After Surrounded ")
self.printresult(record, r, c)
def main() :
task = Regions()
record = [
['O', 'X', 'X', 'X', 'X', 'O', 'X'] ,
['X', 'X', 'X', 'X', 'O', 'X', 'O'] ,
['O', 'O', 'O', 'X', 'X', 'O', 'O'] ,
['X', 'O', 'X', 'X', 'X', 'X', 'X'] ,
['X', 'X', 'O', 'X', 'X', 'X', 'X'] ,
['X', 'O', 'X', 'X', 'X', 'X', 'X'] ,
['X', 'X', 'O', 'O', 'X', 'O', 'O'] ,
['X', 'X', 'O', 'X', 'O', 'X', 'O']
]
#
# Change all O with X when O is Surrounded by X
# Example
# ========
# // Left,right, Bottom and Top are have X
# X X
# X O O X
# X X
#
# Then change center O with X
# X X
# X X X X
# X X
# -----------------------------
# or
# X
# X O X
# X
# Then change center O with X
# X
# X O X
# X
task.solve(record)
if __name__ == "__main__": main()
Output
Before Surrounded
O X X X X O X
X X X X O X O
O O O X X O O
X O X X X X X
X X O X X X X
X O X X X X X
X X O O X O O
X X O X O X O
After Surrounded
O X X X X O X
X X X X X X O
O O O X X O O
X O X X X X X
X X X X X X X
X X X X X X X
X X O O X O O
X X O X O X O
# Ruby Program for
# surrounded regions
class Regions
# Print record elements
def printresult(record, r, c)
i = 0
j = 0
while (i < r)
while (j < c)
print(" ", record[i][j])
j += 1
end
print("\n")
i += 1
j = 0
end
end
# Fill corner elements with a "O" value
def fill(record, i, j, r, c)
if (i < 0 || i >= r || j < 0 || j >= c)
return
end
if (record[i][j] == '+')
# Update element
record[i][j] = 'O'
# visit to down element
self.fill(record, i + 1, j, r, c)
# visit to up element
self.fill(record, i - 1, j, r, c)
# visit to right element
self.fill(record, i, j + 1, r, c)
# visit to left element
self.fill(record, i, j - 1, r, c)
end
end
# Fill surrounded regions
def solve(record)
# loop controlling variables
i = 0
j = 0
r = record.length
c = record[0].length
print("\n Before Surrounded \n")
self.printresult(record, r, c)
# First change the all zero with other symbol "+"
while (i < r)
while (j < c)
if (record[i][j] == 'O')
record[i][j] = '+'
end
j += 1
end
i += 1
j = 0
end
# change boundary
# check first and last column
i = 0
while (i < r)
if (record[i][0] == '+')
self.fill(record, i, 0, r, c)
end
if (record[i][c - 1] == '+')
self.fill(record, i, c - 1, r, c)
end
i += 1
end
# check first and last row
i = 0
while (i < c)
if (record[0][i] == '+')
self.fill(record, 0, i, r, c)
end
if (record[r - 1][i] == '+')
self.fill(record, r - 1, i, r, c)
end
i += 1
end
i = 0
while (i < r)
j = 0
while (j < c)
if (record[i][j] == '+')
record[i][j] = 'X'
end
j += 1
end
i += 1
end
print("\n After Surrounded \n")
self.printresult(record, r, c)
end
end
def main()
task = Regions.new()
record = [
['O', 'X', 'X', 'X', 'X', 'O', 'X'] ,
['X', 'X', 'X', 'X', 'O', 'X', 'O'] ,
['O', 'O', 'O', 'X', 'X', 'O', 'O'] ,
['X', 'O', 'X', 'X', 'X', 'X', 'X'] ,
['X', 'X', 'O', 'X', 'X', 'X', 'X'] ,
['X', 'O', 'X', 'X', 'X', 'X', 'X'] ,
['X', 'X', 'O', 'O', 'X', 'O', 'O'] ,
['X', 'X', 'O', 'X', 'O', 'X', 'O']
]
#
# Change all O with X when O is Surrounded by X
# Example
# ========
# // Left,right, Bottom and Top are have X
# X X
# X O O X
# X X
#
# Then change center O with X
# X X
# X X X X
# X X
# -----------------------------
# or
# X
# X O X
# X
# Then change center O with X
# X
# X O X
# X
task.solve(record)
end
main()
Output
Before Surrounded
O X X X X O X
X X X X O X O
O O O X X O O
X O X X X X X
X X O X X X X
X O X X X X X
X X O O X O O
X X O X O X O
After Surrounded
O X X X X O X
X X X X X X O
O O O X X O O
X O X X X X X
X X X X X X X
X X X X X X X
X X O O X O O
X X O X O X O
/*
Scala Program for
surrounded regions
*/
class Regions
{
// Print record elements
def printresult(record: Array[Array[Character]], r: Int, c: Int): Unit = {
var i: Int = 0;
var j: Int = 0;
while (i < r)
{
while (j < c)
{
print(" " + record(i)(j));
j += 1;
}
print("\n");
i += 1;
j = 0;
}
}
// Fill corner elements with a "O" value
def fill(record: Array[Array[Character]], i: Int, j: Int, r: Int, c: Int): Unit = {
if (i < 0 || i >= r || j < 0 || j >= c)
{
return;
}
if (record(i)(j) == '+')
{
// Update element
record(i)(j) = 'O';
// visit to down element
this.fill(record, i + 1, j, r, c);
// visit to up element
this.fill(record, i - 1, j, r, c);
// visit to right element
this.fill(record, i, j + 1, r, c);
// visit to left element
this.fill(record, i, j - 1, r, c);
}
}
// Fill surrounded regions
def solve(record: Array[Array[Character]]): Unit = {
// loop controlling variables
var i: Int = 0;
var j: Int = 0;
var r: Int = record.length;
var c: Int = record(0).length;
print("\n Before Surrounded \n");
this.printresult(record, r, c);
// First change the all zero with other symbol "+"
while (i < r)
{
while (j < c)
{
if (record(i)(j) == 'O')
{
record(i)(j) = '+';
}
j += 1;
}
i += 1;
j = 0;
}
// change boundary
// check first and last column
i = 0;
while (i < r)
{
if (record(i)(0) == '+')
{
this.fill(record, i, 0, r, c);
}
if (record(i)(c - 1) == '+')
{
this.fill(record, i, c - 1, r, c);
}
i += 1;
}
// check first and last row
i = 0;
while (i < c)
{
if (record(0)(i) == '+')
{
this.fill(record, 0, i, r, c);
}
if (record(r - 1)(i) == '+')
{
this.fill(record, r - 1, i, r, c);
}
i += 1;
}
i = 0;
while (i < r)
{
j = 0;
while (j < c)
{
if (record(i)(j) == '+')
{
record(i)(j) = 'X';
}
j += 1;
}
i += 1;
}
print("\n After Surrounded \n");
this.printresult(record, r, c);
}
}
object Main
{
def main(args: Array[String]): Unit = {
var task: Regions = new Regions();
var record: Array[Array[Character]] = Array(
Array('O', 'X', 'X', 'X', 'X', 'O', 'X'),
Array('X', 'X', 'X', 'X', 'O', 'X', 'O'),
Array('O', 'O', 'O', 'X', 'X', 'O', 'O'),
Array('X', 'O', 'X', 'X', 'X', 'X', 'X'),
Array('X', 'X', 'O', 'X', 'X', 'X', 'X'),
Array('X', 'O', 'X', 'x', 'X', 'X', 'X'),
Array('X', 'X', 'O', 'O', 'X', 'O', 'O'),
Array('X', 'X', 'O', 'X', 'O', 'X', 'O')
);
/*
Change all O with X when O is Surrounded by X
Example
========
// Left,right, Bottom and Top are have X
X X
X O O X
X X
Then change center O with X
X X
X X X X
X X
-----------------------------
or
X
X O X
X
Then change center O with X
X
X O X
X
*/
task.solve(record);
}
}
Output
Before Surrounded
O X X X X O X
X X X X O X O
O O O X X O O
X O X X X X X
X X O X X X X
X O X X X X X
X X O O X O O
X X O X O X O
After Surrounded
O X X X X O X
X X X X X X O
O O O X X O O
X O X X X X X
X X X X X X X
X X X X X X X
X X O O X O O
X X O X O X O
/*
Swift 4 Program for
surrounded regions
*/
class Regions
{
// Print record elements
func printresult(_ record: [
[Character]
], _ r: Int, _ c: Int)
{
var i: Int = 0;
var j: Int = 0;
while (i < r)
{
while (j < c)
{
print(" ", record[i][j], terminator: "");
j += 1;
}
print(terminator: "\n");
i += 1;
j = 0;
}
}
// Fill corner elements with a "O" value
func fill(_ record: inout[[Character]], _ i: Int, _ j: Int, _ r: Int, _ c: Int)
{
if (i < 0 || i >= r || j < 0 || j >= c)
{
return;
}
if (record[i][j] == "+")
{
// Update element
record[i][j] = "O";
// visit to down element
self.fill(&record, i + 1, j, r, c);
// visit to up element
self.fill(&record, i - 1, j, r, c);
// visit to right element
self.fill(&record, i, j + 1, r, c);
// visit to left element
self.fill(&record, i, j - 1, r, c);
}
}
// Fill surrounded regions
func solve(_ record: inout[[Character]])
{
// loop controlling variables
var i: Int = 0;
var j: Int = 0;
let r: Int = record.count;
let c: Int = record[0].count;
print("\n Before Surrounded ");
self.printresult(record, r, c);
// First change the all zero with other symbol "+"
while (i < r)
{
while (j < c)
{
if (record[i][j] == "O")
{
record[i][j] = "+";
}
j += 1;
}
i += 1;
j = 0;
}
// change boundary
// check first and last column
i = 0;
while (i < r)
{
if (record[i][0] == "+")
{
self.fill(&record, i, 0, r, c);
}
if (record[i][c - 1] == "+")
{
self.fill(&record, i, c - 1, r, c);
}
i += 1;
}
// check first and last row
i = 0;
while (i < c)
{
if (record[0][i] == "+")
{
self.fill(&record, 0, i, r, c);
}
if (record[r - 1][i] == "+")
{
self.fill(&record, r - 1, i, r, c);
}
i += 1;
}
i = 0;
while (i < r)
{
j = 0;
while (j < c)
{
if (record[i][j] == "+")
{
record[i][j] = "X";
}
j += 1;
}
i += 1;
}
print("\n After Surrounded ");
self.printresult(record, r, c);
}
}
func main()
{
let task: Regions = Regions();
var record: [[Character]] = [
["O", "X", "X", "X", "X", "O", "X"] ,
["X", "X", "X", "X", "O", "X", "O"] ,
["O", "O", "O", "X", "X", "O", "O"] ,
["X", "O", "X", "X", "X", "X", "X"] ,
["X", "X", "O", "X", "X", "X", "X"] ,
["X", "O", "X", "X", "X", "X", "X"] ,
["X", "X", "O", "O", "X", "O", "O"] ,
["X", "X", "O", "X", "O", "X", "O"]
];
/*
Change all O with X when O is Surrounded by X
Example
========
// Left,right, Bottom and Top are have X
X X
X O O X
X X
Then change center O with X
X X
X X X X
X X
-----------------------------
or
X
X O X
X
Then change center O with X
X
X O X
X
*/
task.solve(&record);
}
main();
Output
Before Surrounded
O X X X X O X
X X X X O X O
O O O X X O O
X O X X X X X
X X O X X X X
X O X X X X X
X X O O X O O
X X O X O X O
After Surrounded
O X X X X O X
X X X X X X O
O O O X X O O
X O X X X X X
X X X X X X X
X X X X X X X
X X O O X O O
X X O X O X O
/*
Kotlin Program for
surrounded regions
*/
class Regions
{
// Print record elements
fun printresult(record: Array <Array<Char>> , r: Int, c: Int): Unit
{
var i: Int = 0;
var j: Int = 0;
while (i < r)
{
while (j < c)
{
print(" " + record[i][j]);
j += 1;
}
print("\n");
i += 1;
j = 0;
}
}
// Fill corner elements with a "O" value
fun fill(record: Array <Array<Char>> , i: Int, j: Int, r: Int, c: Int): Unit
{
if (i < 0 || i >= r || j < 0 || j >= c)
{
return;
}
if (record[i][j] == '+')
{
// Update element
record[i][j] = 'O';
// visit to down element
this.fill(record, i + 1, j, r, c);
// visit to up element
this.fill(record, i - 1, j, r, c);
// visit to right element
this.fill(record, i, j + 1, r, c);
// visit to left element
this.fill(record, i, j - 1, r, c);
}
}
// Fill surrounded regions
fun solve(record: Array < Array < Char >> ): Unit
{
// loop controlling variables
var i: Int = 0;
var j: Int = 0;
var r: Int = record.count();
var c: Int = record[0].count();
print("\n Before Surrounded \n");
this.printresult(record, r, c);
// First change the all zero with other symbol "+"
while (i < r)
{
while (j < c)
{
if (record[i][j] == 'O')
{
record[i][j] = '+';
}
j += 1;
}
i += 1;
j = 0;
}
// change boundary
// check first and last column
i = 0;
while (i < r)
{
if (record[i][0] == '+')
{
this.fill(record, i, 0, r, c);
}
if (record[i][c - 1] == '+')
{
this.fill(record, i, c - 1, r, c);
}
i += 1;
}
// check first and last row
i = 0;
while (i < c)
{
if (record[0][i] == '+')
{
this.fill(record, 0, i, r, c);
}
if (record[r - 1][i] == '+')
{
this.fill(record, r - 1, i, r, c);
}
i += 1;
}
i = 0;
while (i < r)
{
j = 0;
while (j < c)
{
if (record[i][j] == '+')
{
record[i][j] = 'X';
}
j += 1;
}
i += 1;
}
print("\n After Surrounded \n");
this.printresult(record, r, c);
}
}
fun main(args: Array <String> ): Unit
{
var task: Regions = Regions();
var record: Array<Array<Char>> = arrayOf(
arrayOf('O', 'X', 'X', 'X', 'X', 'O', 'X'),
arrayOf('X', 'X', 'X', 'X', 'O', 'X', 'O'),
arrayOf('O', 'O', 'O', 'X', 'X', 'O', 'O'),
arrayOf('X', 'O', 'X', 'X', 'X', 'X', 'X'),
arrayOf('X', 'X', 'O', 'X', 'X', 'X', 'X'),
arrayOf('X', 'O', 'X', 'X', 'X', 'X', 'X'),
arrayOf('X', 'X', 'O', 'O', 'X', 'O', 'O'),
arrayOf('X', 'X', 'O', 'X', 'O', 'X', 'O')
);
/*
Change all O with X when O is Surrounded by X
Example
========
// Left,right, Bottom and Top are have X
X X
X O O X
X X
Then change center O with X
X X
X X X X
X X
-----------------------------
or
X
X O X
X
Then change center O with X
X
X O X
X
*/
task.solve(record);
}
Output
Before Surrounded
O X X X X O X
X X X X O X O
O O O X X O O
X O X X X X X
X X O X X X X
X O X X X X X
X X O O X O O
X X O X O X O
After Surrounded
O X X X X O X
X X X X X X O
O O O X X O O
X O X X X X X
X X X X X X X
X X X X X X X
X X O O X O O
X X O X O X O
Time Complexity
The time complexity of the solution is O(R * C) because we perform a traversal of the entire matrix to replace 'O' with '+', and then traverse the boundary elements to perform the DFS or BFS operation. The space complexity is O(1) as we modify the input matrix in place without using any additional data structures.
Output Explanation
Before surrounded, the matrix is:
O X X X X O X X X X X O X O O O O X X O O X O X X X X X X X O X X X X X O X X X X X X X O O X O O X X O X O X O
After surrounded, the matrix is:
O X X X X O X X X X X X X O O O O X X O O X O X X X X X X X X X X X X X X X X X X X X X O O X O O X X O X O X O
The 'O' elements that were surrounded by 'X' have been replaced with 'X', while the boundary elements and other 'O' elements that were not surrounded remain unchanged.
Please share your knowledge to improve code and content standard. Also submit your doubts, and test case. We improve by your feedback. We will try to resolve your query as soon as possible.
New Comment