给定一个由“O”和“X”组成的矩阵,如果被“X”包围,则用“X”替换“O”

给定一个矩阵,其中每个元素都是“O”或“X”,如果被“X”包围,则将“O”替换为“X”。如果“X”位于“O”的正下方、正上方、正左侧和正右侧,则“O”(或一组“O”)被“X”包围。 例如:

null
Input: mat[M][N] =  {{'X', 'O', 'X', 'X', 'X', 'X'},                     {'X', 'O', 'X', 'X', 'O', 'X'},                     {'X', 'X', 'X', 'O', 'O', 'X'},                     {'O', 'X', 'X', 'X', 'X', 'X'},                     {'X', 'X', 'X', 'O', 'X', 'O'},                     {'O', 'O', 'X', 'O', 'O', 'O'},                    };Output: mat[M][N] =  {{'X', 'O', 'X', 'X', 'X', 'X'},                      {'X', 'O', 'X', 'X', 'X', 'X'},                      {'X', 'X', 'X', 'X', 'X', 'X'},                      {'O', 'X', 'X', 'X', 'X', 'X'},                      {'X', 'X', 'X', 'O', 'X', 'O'},                      {'O', 'O', 'X', 'O', 'O', 'O'},                    };

Input: mat[M][N] =  {{'X', 'X', 'X', 'X'}                     {'X', 'O', 'X', 'X'}                     {'X', 'O', 'O', 'X'}                     {'X', 'O', 'X', 'X'}                     {'X', 'X', 'O', 'O'}                    };

Input: mat[M][N] =  {{'X', 'X', 'X', 'X'}                     {'X', 'X', 'X', 'X'}                     {'X', 'X', 'X', 'X'}                     {'X', 'X', 'X', 'X'}                     {'X', 'X', 'O', 'O'}                    };

这主要是一个应用程序 洪水填充算法 .这里的主要区别是,如果“O”位于以边界为终点的区域,则它不会被“X”取代。下面是进行这种特殊洪水填充的简单步骤。 1) 遍历给定的矩阵,用一个特殊字符“-”替换所有的“O”。 2) 遍历给定矩阵的四条边并调用 填海(’-‘,O’) 对于边上的每一个“-”。其余的“-”是表示“O”(在原始矩阵中)将被“X”替换的字符。 3) 遍历矩阵,将所有“-”替换为“X”。 让我们用一个例子来看看上述算法的步骤。 下面是输入矩阵。

       mat[M][N] =  {{'X', 'O', 'X', 'X', 'X', 'X'},                     {'X', 'O', 'X', 'X', 'O', 'X'},                     {'X', 'X', 'X', 'O', 'O', 'X'},                     {'O', 'X', 'X', 'X', 'X', 'X'},                     {'X', 'X', 'X', 'O', 'X', 'O'},                     {'O', 'O', 'X', 'O', 'O', 'O'},                    };

第一步: 将所有“O”替换为“-”。

       mat[M][N] =  {{'X', '-', 'X', 'X', 'X', 'X'},                     {'X', '-', 'X', 'X', '-', 'X'},                     {'X', 'X', 'X', '-', '-', 'X'},                     {'-', 'X', 'X', 'X', 'X', 'X'},                     {'X', 'X', 'X', '-', 'X', '-'},                     {'-', '-', 'X', '-', '-', '-'},                    };

第二步: 对值等于“-”的所有边缘元素调用泛光填充(“-”,“O”)

       mat[M][N] =  {{'X', 'O', 'X', 'X', 'X', 'X'},                     {'X', 'O', 'X', 'X', '-', 'X'},                     {'X', 'X', 'X', '-', '-', 'X'},                     {'O', 'X', 'X', 'X', 'X', 'X'},                     {'X', 'X', 'X', 'O', 'X', 'O'},                     {'O', 'O', 'X', 'O', 'O', 'O'},                    };

第三步: 将所有“-”替换为“X”。

       mat[M][N] =  {{'X', 'O', 'X', 'X', 'X', 'X'},                     {'X', 'O', 'X', 'X', 'X', 'X'},                     {'X', 'X', 'X', 'X', 'X', 'X'},                     {'O', 'X', 'X', 'X', 'X', 'X'},                     {'X', 'X', 'X', 'O', 'X', 'O'},                     {'O', 'O', 'X', 'O', 'O', 'O'},                    };

下面是上述算法的实现。

C++

// A C++ program to replace all 'O's with 'X''s if surrounded by 'X'
#include<iostream>
using namespace std;
// Size of given matrix is M X N
#define M 6
#define N 6
// A recursive function to replace previous value 'prevV' at  '(x, y)'
// and all surrounding values of (x, y) with new value 'newV'.
void floodFillUtil( char mat[][N], int x, int y, char prevV, char newV)
{
// Base cases
if (x < 0 || x >= M || y < 0 || y >= N)
return ;
if (mat[x][y] != prevV)
return ;
// Replace the color at (x, y)
mat[x][y] = newV;
// Recur for north, east, south and west
floodFillUtil(mat, x+1, y, prevV, newV);
floodFillUtil(mat, x-1, y, prevV, newV);
floodFillUtil(mat, x, y+1, prevV, newV);
floodFillUtil(mat, x, y-1, prevV, newV);
}
// Returns size of maximum size subsquare matrix
// surrounded by 'X'
int replaceSurrounded( char mat[][N])
{
// Step 1: Replace all 'O'  with '-'
for ( int i=0; i<M; i++)
for ( int j=0; j<N; j++)
if (mat[i][j] == 'O' )
mat[i][j] = '-' ;
// Call floodFill for all '-' lying on edges
for ( int i=0; i<M; i++) // Left side
if (mat[i][0] == '-' )
floodFillUtil(mat, i, 0, '-' , 'O' );
for ( int i=0; i<M; i++) //  Right side
if (mat[i][N-1] == '-' )
floodFillUtil(mat, i, N-1, '-' , 'O' );
for ( int i=0; i<N; i++) // Top side
if (mat[0][i] == '-' )
floodFillUtil(mat, 0, i, '-' , 'O' );
for ( int i=0; i<N; i++) // Bottom side
if (mat[M-1][i] == '-' )
floodFillUtil(mat, M-1, i, '-' , 'O' );
// Step 3: Replace all '-' with 'X'
for ( int i=0; i<M; i++)
for ( int j=0; j<N; j++)
if (mat[i][j] == '-' )
mat[i][j] = 'X' ;
}
// Driver program to test above function
int main()
{
char mat[][N] =  {{ 'X' , 'O' , 'X' , 'O' , 'X' , 'X' },
{ 'X' , 'O' , 'X' , 'X' , 'O' , 'X' },
{ 'X' , 'X' , 'X' , 'O' , 'X' , 'X' },
{ 'O' , 'X' , 'X' , 'X' , 'X' , 'X' },
{ 'X' , 'X' , 'X' , 'O' , 'X' , 'O' },
{ 'O' , 'O' , 'X' , 'O' , 'O' , 'O' },
};
replaceSurrounded(mat);
for ( int i=0; i<M; i++)
{
for ( int j=0; j<N; j++)
cout << mat[i][j] << " " ;
cout << endl;
}
return 0;
}


JAVA

// A Java program to replace
// all 'O's with 'X''s if
// surrounded by 'X'
import java.io.*;
class GFG
{
static int M = 6 ;
static int N = 6 ;
static void floodFillUtil( char mat[][], int x,
int y, char prevV,
char newV)
{
// Base cases
if (x < 0 || x >= M ||
y < 0 || y >= N)
return ;
if (mat[x][y] != prevV)
return ;
// Replace the color at (x, y)
mat[x][y] = newV;
// Recur for north,
// east, south and west
floodFillUtil(mat, x + 1 , y,
prevV, newV);
floodFillUtil(mat, x - 1 , y,
prevV, newV);
floodFillUtil(mat, x, y + 1 ,
prevV, newV);
floodFillUtil(mat, x, y - 1 ,
prevV, newV);
}
// Returns size of maximum
// size subsquare matrix
// surrounded by 'X'
static void replaceSurrounded( char mat[][])
{
// Step 1: Replace
// all 'O' with '-'
for ( int i = 0 ; i < M; i++)
for ( int j = 0 ; j < N; j++)
if (mat[i][j] == 'O' )
mat[i][j] = '-' ;
// Call floodFill for
// all '-' lying on edges
for ( int i = 0 ; i < M; i++) // Left side
if (mat[i][ 0 ] == '-' )
floodFillUtil(mat, i, 0 ,
'-' , 'O' );
for ( int i = 0 ; i < M; i++) // Right side
if (mat[i][N - 1 ] == '-' )
floodFillUtil(mat, i, N - 1 ,
'-' , 'O' );
for ( int i = 0 ; i < N; i++) // Top side
if (mat[ 0 ][i] == '-' )
floodFillUtil(mat, 0 , i,
'-' , 'O' );
for ( int i = 0 ; i < N; i++) // Bottom side
if (mat[M - 1 ][i] == '-' )
floodFillUtil(mat, M - 1 ,
i, '-' , 'O' );
// Step 3: Replace
// all '-' with 'X'
for ( int i = 0 ; i < M; i++)
for ( int j = 0 ; j < N; j++)
if (mat[i][j] == '-' )
mat[i][j] = 'X' ;
}
// Driver Code
public static void main (String[] args)
{
char [][] mat = {{ 'X' , 'O' , 'X' ,
'O' , 'X' , 'X' },
{ 'X' , 'O' , 'X' ,
'X' , 'O' , 'X' },
{ 'X' , 'X' , 'X' ,
'O' , 'X' , 'X' },
{ 'O' , 'X' , 'X' ,
'X' , 'X' , 'X' },
{ 'X' , 'X' , 'X' ,
'O' , 'X' , 'O' },
{ 'O' , 'O' , 'X' ,
'O' , 'O' , 'O' }};
replaceSurrounded(mat);
for ( int i = 0 ; i < M; i++)
{
for ( int j = 0 ; j < N; j++)
System.out.print(mat[i][j] + " " );
System.out.println( "" );
}
}
}
// This code is contributed
// by shiv_bhakt


Python3

# Python3 program to replace all 'O's with
# 'X's if surrounded by 'X'
# Size of given matrix is M x N
M = 6
N = 6
# A recursive function to replace previous
# value 'prevV' at '(x, y)' and all surrounding
# values of (x, y) with new value 'newV'.
def floodFillUtil(mat, x, y, prevV, newV):
# Base Cases
if (x < 0 or x > = M or y < 0 or y > = N):
return
if (mat[x][y] ! = prevV):
return
# Replace the color at (x, y)
mat[x][y] = newV
# Recur for north, east, south and west
floodFillUtil(mat, x + 1 , y, prevV, newV)
floodFillUtil(mat, x - 1 , y, prevV, newV)
floodFillUtil(mat, x, y + 1 , prevV, newV)
floodFillUtil(mat, x, y - 1 , prevV, newV)
# Returns size of maximum size subsquare
#  matrix surrounded by 'X'
def replaceSurrounded(mat):
# Step 1: Replace all 'O's with '-'
for i in range (M):
for j in range (N):
if (mat[i][j] = = 'O' ):
mat[i][j] = '-'
# Call floodFill for all '-'
# lying on edges
# Left Side
for i in range (M):
if (mat[i][ 0 ] = = '-' ):
floodFillUtil(mat, i, 0 , '-' , 'O' )
# Right side
for i in range (M):
if (mat[i][N - 1 ] = = '-' ):
floodFillUtil(mat, i, N - 1 , '-' , 'O' )
# Top side
for i in range (N):
if (mat[ 0 ][i] = = '-' ):
floodFillUtil(mat, 0 , i, '-' , 'O' )
# Bottom side
for i in range (N):
if (mat[M - 1 ][i] = = '-' ):
floodFillUtil(mat, M - 1 , i, '-' , 'O' )
# Step 3: Replace all '-' with 'X'
for i in range (M):
for j in range (N):
if (mat[i][j] = = '-' ):
mat[i][j] = 'X'
# Driver code
if __name__ = = '__main__' :
mat = [ [ 'X' , 'O' , 'X' , 'O' , 'X' , 'X' ],
[ 'X' , 'O' , 'X' , 'X' , 'O' , 'X' ],
[ 'X' , 'X' , 'X' , 'O' , 'X' , 'X' ],
[ 'O' , 'X' , 'X' , 'X' , 'X' , 'X' ],
[ 'X' , 'X' , 'X' , 'O' , 'X' , 'O' ],
[ 'O' , 'O' , 'X' , 'O' , 'O' , 'O' ] ];
replaceSurrounded(mat)
for i in range (M):
print ( * mat[i])
# This code is contributed by himanshu77


C#

// A C# program to replace
// all 'O's with 'X''s if
// surrounded by 'X'
using System;
class GFG
{
static int M = 6;
static int N = 6;
static void floodFillUtil( char [,]mat, int x,
int y, char prevV,
char newV)
{
// Base cases
if (x < 0 || x >= M ||
y < 0 || y >= N)
return ;
if (mat[x, y] != prevV)
return ;
// Replace the color at (x, y)
mat[x, y] = newV;
// Recur for north,
// east, south and west
floodFillUtil(mat, x + 1, y,
prevV, newV);
floodFillUtil(mat, x - 1, y,
prevV, newV);
floodFillUtil(mat, x, y + 1,
prevV, newV);
floodFillUtil(mat, x, y - 1,
prevV, newV);
}
// Returns size of maximum
// size subsquare matrix
// surrounded by 'X'
static void replaceSurrounded( char [,]mat)
{
// Step 1: Replace
// all 'O' with '-'
for ( int i = 0; i < M; i++)
for ( int j = 0; j < N; j++)
if (mat[i, j] == 'O' )
mat[i, j] = '-' ;
// Call floodFill for
// all '-' lying on edges
for ( int i = 0; i < M; i++) // Left side
if (mat[i, 0] == '-' )
floodFillUtil(mat, i, 0,
'-' , 'O' );
for ( int i = 0; i < M; i++) // Right side
if (mat[i, N - 1] == '-' )
floodFillUtil(mat, i, N - 1,
'-' , 'O' );
for ( int i = 0; i < N; i++) // Top side
if (mat[0, i] == '-' )
floodFillUtil(mat, 0, i,
'-' , 'O' );
for ( int i = 0; i < N; i++) // Bottom side
if (mat[M - 1, i] == '-' )
floodFillUtil(mat, M - 1,
i, '-' , 'O' );
// Step 3: Replace
// all '-' with 'X'
for ( int i = 0; i < M; i++)
for ( int j = 0; j < N; j++)
if (mat[i, j] == '-' )
mat[i, j] = 'X' ;
}
// Driver Code
public static void Main ()
{
char [,]mat = new char [,]
{{ 'X' , 'O' , 'X' ,
'O' , 'X' , 'X' },
{ 'X' , 'O' , 'X' ,
'X' , 'O' , 'X' },
{ 'X' , 'X' , 'X' ,
'O' , 'X' , 'X' },
{ 'O' , 'X' , 'X' ,
'X' , 'X' , 'X' },
{ 'X' , 'X' , 'X' ,
'O' , 'X' , 'O' },
{ 'O' , 'O' , 'X' ,
'O' , 'O' , 'O' }};
replaceSurrounded(mat);
for ( int i = 0; i < M; i++)
{
for ( int j = 0; j < N; j++)
Console.Write(mat[i, j] + " " );
Console.WriteLine( "" );
}
}
}
// This code is contributed
// by shiv_bhakt


PHP

<?php
// A PHP program to replace all
// 'O's with 'X''s if surrounded by 'X'
// Size of given
// matrix is M X N
$M = 6;
$N = 6;
// A recursive function to replace
// previous value 'prevV' at '(x, y)'
// and all surrounding values of
// (x, y) with new value 'newV'.
function floodFillUtil(& $mat , $x , $y ,
$prevV , $newV )
{
// Base cases
if ( $x < 0 || $x >= $GLOBALS [ 'M' ] ||
$y < 0 || $y >= $GLOBALS [ 'N' ])
return ;
if ( $mat [ $x ][ $y ] != $prevV )
return ;
// Replace the color at (x, y)
$mat [ $x ][ $y ] = $newV ;
// Recur for north,
// east, south and west
floodFillUtil( $mat , $x + 1, $y , $prevV , $newV );
floodFillUtil( $mat , $x - 1, $y , $prevV , $newV );
floodFillUtil( $mat , $x , $y + 1, $prevV , $newV );
floodFillUtil( $mat , $x , $y - 1, $prevV , $newV );
}
// Returns size of maximum
// size subsquare matrix
// surrounded by 'X'
function replaceSurrounded(& $mat )
{
// Step 1: Replace all 'O' with '-'
for ( $i = 0; $i < $GLOBALS [ 'M' ]; $i ++)
for ( $j = 0; $j < $GLOBALS [ 'N' ]; $j ++)
if ( $mat [ $i ][ $j ] == 'O' )
$mat [ $i ][ $j ] = '-' ;
// Call floodFill for all
// '-' lying on edges
for ( $i = 0;
$i < $GLOBALS [ 'M' ]; $i ++) // Left side
if ( $mat [ $i ][0] == '-' )
floodFillUtil( $mat , $i , 0, '-' , 'O' );
for ( $i = 0; $i < $GLOBALS [ 'M' ]; $i ++) // Right side
if ( $mat [ $i ][ $GLOBALS [ 'N' ] - 1] == '-' )
floodFillUtil( $mat , $i ,
$GLOBALS [ 'N' ] - 1, '-' , 'O' );
for ( $i = 0; $i < $GLOBALS [ 'N' ]; $i ++) // Top side
if ( $mat [0][ $i ] == '-' )
floodFillUtil( $mat , 0, $i , '-' , 'O' );
for ( $i = 0; $i < $GLOBALS [ 'N' ]; $i ++) // Bottom side
if ( $mat [ $GLOBALS [ 'M' ] - 1][ $i ] == '-' )
floodFillUtil( $mat , $GLOBALS [ 'M' ] - 1,
$i , '-' , 'O' );
// Step 3: Replace all '-' with 'X'
for ( $i = 0; $i < $GLOBALS [ 'M' ]; $i ++)
for ( $j = 0; $j < $GLOBALS [ 'N' ]; $j ++)
if ( $mat [ $i ][ $j ] == '-' )
$mat [ $i ][ $j ] = 'X' ;
}
// Driver Code
$mat = array ( array ( 'X' , 'O' , 'X' , 'O' , 'X' , 'X' ),
array ( 'X' , 'O' , 'X' , 'X' , 'O' , 'X' ),
array ( 'X' , 'X' , 'X' , 'O' , 'X' , 'X' ),
array ( 'O' , 'X' , 'X' , 'X' , 'X' , 'X' ),
array ( 'X' , 'X' , 'X' , 'O' , 'X' , 'O' ),
array ( 'O' , 'O' , 'X' , 'O' , 'O' , 'O' ));
replaceSurrounded( $mat );
for ( $i = 0; $i < $GLOBALS [ 'M' ]; $i ++)
{
for ( $j = 0; $j < $GLOBALS [ 'N' ]; $j ++)
echo $mat [ $i ][ $j ]. " " ;
echo "" ;
}
// This code is contributed by ChitraNayal
?>


Javascript

<script>
// A Javascript program to replace
// all 'O's with 'X''s if
// surrounded by 'X'
let M = 6;
let N = 6;
function floodFillUtil(mat,x,y,prevV,newV)
{
// Base cases
if (x < 0 || x >= M ||
y < 0 || y >= N)
return ;
if (mat[x][y] != prevV)
return ;
// Replace the color at (x, y)
mat[x][y] = newV;
// Recur for north,
// east, south and west
floodFillUtil(mat, x + 1, y,
prevV, newV);
floodFillUtil(mat, x - 1, y,
prevV, newV);
floodFillUtil(mat, x, y + 1,
prevV, newV);
floodFillUtil(mat, x, y - 1,
prevV, newV);
}
// Returns size of maximum
// size subsquare matrix
// surrounded by 'X'
function replaceSurrounded(mat)
{
// Step 1: Replace
// all 'O' with '-'
for (let i = 0; i < M; i++)
for (let j = 0; j < N; j++)
if (mat[i][j] == 'O ')
mat[i][j] = ' - ';
// Call floodFill for
// all ' - ' lying on edges
for (let i = 0; i < M; i++) // Left side
if (mat[i][0] == ' - ')
floodFillUtil(mat, i, 0,
' - ', ' O ');
for (let i = 0; i < M; i++) // Right side
if (mat[i][N - 1] == ' - ')
floodFillUtil(mat, i, N - 1,
' - ', ' O ');
for (let i = 0; i < N; i++) // Top side
if (mat[0][i] == ' - ')
floodFillUtil(mat, 0, i,
' - ', ' O ');
for (let i = 0; i < N; i++) // Bottom side
if (mat[M - 1][i] == ' - ')
floodFillUtil(mat, M - 1,
i, ' - ', ' O ');
// Step 3: Replace
// all ' - ' with ' X '
for (let i = 0; i < M; i++)
for (let j = 0; j < N; j++)
if (mat[i][j] == ' - ')
mat[i][j] = ' X ';
}
// Driver Code
let mat = [ [ ' X ', ' O ', ' X ', ' O ', ' X ', ' X ' ],
[ ' X ', ' O ', ' X ', ' X ', ' O ', ' X ' ],
[ ' X ', ' X ', ' X ', ' O ', ' X ', ' X ' ],
[ ' O ', ' X ', ' X ', ' X ', ' X ', ' X ' ],
[ ' X ', ' X ', ' X ', ' O ', ' X ', ' O ' ],
[ ' O ', ' O ', ' X ', ' O ', ' O ', ' O' ] ];
replaceSurrounded(mat);
for (let i = 0; i < M; i++)
{
for (let j = 0; j < N; j++)
document.write(mat[i][j] + " " );
document.write( "<br>" );
}
// This code is contributed by rag2127
</script>


输出:

X O X O X X X O X X X X X X X X X X O X X X X X X X X O X O O O X O O O 

上述解的时间复杂度为O(MN)。请注意,矩阵的每个元素最多处理三次。 本文由 安诺尔 。如果您发现任何不正确的地方,或者您想分享有关上述主题的更多信息,请发表评论。

© 版权声明
THE END
喜欢就支持一下吧
点赞11 分享