#include <bits/stdc++.h>
using namespace std;
char mat[ 101 ] [ 101 ] ;
int visited[ 101 ] [ 101 ] = { 0 } ;
void replace( char mat[ 101 ] [ 101 ] ,int i,int j,int n,int m,int visited[ 101 ] [ 101 ] )
{
if ( i== 0 || j== 0 || i== n- 1 || j== m- 1 )
return ;
if ( mat[ i] [ j] == 'X' )
return ;
else
{
if ( mat[ i] [ j] == 'O' )
{
mat[ i] [ j] = 'X' ;
}
replace( mat,i- 1 ,j,n,m,visited) ;
replace( mat,i+ 1 ,j,n,m,visited) ;
replace( mat,i,j- 1 ,n,m,visited) ;
replace( mat,i,j+ 1 ,n,m,visited) ;
if ( visited[ i] [ j] == 1 )
mat[ i] [ j] = 'O' ;
}
}
bool check( char mat[ 101 ] [ 101 ] ,int i,int j,int n,int m,int visited[ 101 ] [ 101 ] )
{
//check in left in row if there is X present
for ( int col= j- 1 ; col>= 0 ; col-- )
{
if ( mat[ i] [ col] == 'X' )
break ;
else if ( col== 0 && mat[ i] [ col] == 'O' )
return false ;
}
//check in right in row if there is X present
for ( int col= j+ 1 ; col< m; col++ )
{
if ( mat[ i] [ col] == 'X' )
break ;
else if ( col== m- 1 && mat[ i] [ col] == 'O' )
return false ;
}
//check in upward in col if there is X present
for ( int row= i- 1 ; row>= 0 ; row-- )
{
if ( mat[ row] [ j] == 'X' )
break ;
else if ( row== 0 && mat[ row] [ j] == 'O' )
return false ;
}
//check in downward in col if there is X present
for ( int row= i+ 1 ; row< n; row++ )
{
if ( mat[ row] [ j] == 'X' )
break ;
else if ( row== n- 1 && mat[ row] [ j] == 'O' )
return false ;
}
return true ;
}
void find( char mat[ 101 ] [ 101 ] ,int n,int m)
{
for ( int i= 1 ; i< n- 1 ; i++ )
{
for ( int j= 1 ; j< m- 1 ; j++ )
{
if ( mat[ i] [ j] == 'O' )
{
if ( check( mat,i,j,n,m,visited) == true )
replace( mat,i,j,n,m,visited) ;
else
visited[ i] [ j] = 1 ;
}
}
}
}
int main( ) {
//code
int t;
cin >> t;
while ( t-- )
{
int n,m;
cin >> n>> m;
for ( int i= 0 ; i< n; i++ )
{
for ( int j= 0 ; j< m; j++ )
{
cin >> mat[ i] [ j] ;
}
}
for ( int i= 0 ; i< n; i++ )
{
for ( int j= 0 ; j< m; j++ )
cout << mat[ i] [ j] << " " ;
cout << endl;
}
cout << endl;
find( mat,n,m) ;
for ( int i= 0 ; i< n; i++ )
{
for ( int j= 0 ; j< m; j++ )
cout << mat[ i] [ j] << " " ;
cout << endl;
}
cout << endl;
}
return 0 ;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CmNoYXIgbWF0WzEwMV1bMTAxXTsKaW50IHZpc2l0ZWRbMTAxXVsxMDFdPXswfTsKdm9pZCByZXBsYWNlKGNoYXIgbWF0WzEwMV1bMTAxXSxpbnQgaSxpbnQgaixpbnQgbixpbnQgbSxpbnQgdmlzaXRlZFsxMDFdWzEwMV0pCnsKCWlmKGk9PTAgfHwgaj09MCB8fCBpPT1uLTEgfHwgaj09bS0xKQoJcmV0dXJuIDsKCWlmKG1hdFtpXVtqXT09J1gnKQoJcmV0dXJuOwoJCgllbHNlCgl7CglpZihtYXRbaV1bal09PSdPJykKCXsKCW1hdFtpXVtqXT0nWCc7Cgl9CglyZXBsYWNlKG1hdCxpLTEsaixuLG0sdmlzaXRlZCk7CglyZXBsYWNlKG1hdCxpKzEsaixuLG0sdmlzaXRlZCk7CglyZXBsYWNlKG1hdCxpLGotMSxuLG0sdmlzaXRlZCk7CglyZXBsYWNlKG1hdCxpLGorMSxuLG0sdmlzaXRlZCk7CglpZih2aXNpdGVkW2ldW2pdPT0xKQoJbWF0W2ldW2pdPSdPJzsKCX0KfQpib29sIGNoZWNrKGNoYXIgbWF0WzEwMV1bMTAxXSxpbnQgaSxpbnQgaixpbnQgbixpbnQgbSxpbnQgdmlzaXRlZFsxMDFdWzEwMV0pCnsKICAgIC8vY2hlY2sgaW4gbGVmdCBpbiByb3cgaWYgdGhlcmUgaXMgWCBwcmVzZW50CiAgICBmb3IoaW50IGNvbD1qLTE7Y29sPj0wO2NvbC0tKQogICAgewogICAgICAgIGlmKG1hdFtpXVtjb2xdPT0nWCcpCiAgICAgICAgYnJlYWs7CiAgICAgICAgZWxzZSBpZihjb2w9PTAgJiYgbWF0W2ldW2NvbF09PSdPJykKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgICAvL2NoZWNrIGluIHJpZ2h0IGluIHJvdyBpZiB0aGVyZSBpcyBYIHByZXNlbnQKICAgICBmb3IoaW50IGNvbD1qKzE7Y29sPG07Y29sKyspCiAgICB7CiAgICAgICAgaWYobWF0W2ldW2NvbF09PSdYJykKICAgICAgICBicmVhazsKICAgICAgICBlbHNlIGlmKGNvbD09bS0xICYmIG1hdFtpXVtjb2xdPT0nTycpCiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAgLy9jaGVjayBpbiB1cHdhcmQgaW4gY29sIGlmIHRoZXJlIGlzIFggcHJlc2VudAogICAgZm9yKGludCByb3c9aS0xO3Jvdz49MDtyb3ctLSkKICAgIHsKICAgICAgICBpZihtYXRbcm93XVtqXT09J1gnKQogICAgICAgYnJlYWs7CiAgICAgICAgZWxzZSBpZihyb3c9PTAgJiYgbWF0W3Jvd11bal09PSdPJykKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgICAvL2NoZWNrIGluIGRvd253YXJkIGluIGNvbCBpZiB0aGVyZSBpcyBYIHByZXNlbnQKICAgIGZvcihpbnQgcm93PWkrMTtyb3c8bjtyb3crKykKICAgIHsKICAgICAgICBpZihtYXRbcm93XVtqXT09J1gnKQogICAgICAgIGJyZWFrOwogICAgICAgIGVsc2UgaWYocm93PT1uLTEgJiYgbWF0W3Jvd11bal09PSdPJykKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgIHJldHVybiB0cnVlOwp9CnZvaWQgZmluZChjaGFyIG1hdFsxMDFdWzEwMV0saW50IG4saW50IG0pCnsKICAgIGZvcihpbnQgaT0xO2k8bi0xO2krKykKICAgIHsKICAgICAgICBmb3IoaW50IGo9MTtqPG0tMTtqKyspCiAgICAgICAgewogICAgICAgICAgICBpZihtYXRbaV1bal09PSdPJykKICAgICAgICAgICAgewogICAgICAgICAgaWYoY2hlY2sobWF0LGksaixuLG0sdmlzaXRlZCk9PXRydWUpCiAgICAgICAgICByZXBsYWNlKG1hdCxpLGosbixtLHZpc2l0ZWQpOwogICAgICAgICAgZWxzZSAKICAgICAgICAgIHZpc2l0ZWRbaV1bal09MTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgCn0KaW50IG1haW4oKSB7CgkvL2NvZGUKCWludCB0OwoJY2luPj50OwoJd2hpbGUodC0tKQoJewoJICAgaW50IG4sbTsKCSAgIGNpbj4+bj4+bTsKCSAgIGZvcihpbnQgaT0wO2k8bjtpKyspCgkgICB7CgkgICAgICAgZm9yKGludCBqPTA7ajxtO2orKykKCSAgICAgICB7CgkgICAgICAgICAgIGNpbj4+bWF0W2ldW2pdOwoJICAgICAgIH0KCSAgIH0KCSAgIGZvcihpbnQgaT0wO2k8bjtpKyspCgkgICB7CgkgICAgICAgZm9yKGludCBqPTA7ajxtO2orKykKCSAgICAgICBjb3V0PDxtYXRbaV1bal08PCIgIjsKCSAgICAgICBjb3V0PDxlbmRsOwoJICAgfQoJICAgY291dDw8ZW5kbDsKCSAgIGZpbmQobWF0LG4sbSk7CgkgICBmb3IoaW50IGk9MDtpPG47aSsrKQoJICAgewoJICAgICAgIGZvcihpbnQgaj0wO2o8bTtqKyspCgkgICAgICAgY291dDw8bWF0W2ldW2pdPDwiICI7CgkgICAgICAgY291dDw8ZW5kbDsKCSAgIH0KCSAgIGNvdXQ8PGVuZGw7Cgl9CglyZXR1cm4gMDsKfQ==