#include <bits/stdc++.h>
using namespace std;
// M x N matrix
#define M 10
#define N 10
// Below arrays details all 8 possible movements
int row[ ] = { - 1 , - 1 , - 1 , 0 , 0 , 1 , 1 , 1 } ;
int col[ ] = { - 1 , 0 , 1 , - 1 , 1 , - 1 , 0 , 1 } ;
// check if it is possible to go to pixel (x, y) from
// current pixel. The function returns false if the pixel
// has different color or it is not a valid pixel
bool isSafe( char mat[ M] [ N] , int x, int y, char target)
{
return x >= 0 && x < N && y >= 0 && y < M
&& mat[ x] [ y] == target;
}
// Flood fill using BFS
void floodfill( char mat[ M] [ N] , int x, int y, char replacement)
{
// create a queue and enqueue starting pixel
queue< pair< int , int >> q;
q.push ( { x, y} ) ;
// get target color
char target = mat[ x] [ y] ;
// run till queue is not empty
while ( ! q.empty ( ) )
{
// pop front node from queue and process it
pair< int , int > node = q.front ( ) ;
q.pop ( ) ;
// (x, y) represents current pixel
int x = node.first , y = node.second ;
// replace current pixel color with that of replacement
mat[ x] [ y] = replacement;
// process all 8 adjacent pixels of current pixel and
// enqueue each valid pixel
for ( int k = 0 ; k < 8 ; k++ )
{
// if adjacent pixel at position (x + row[k], y + col[k]) is
// a valid pixel and have same color as that of current pixel
if ( isSafe( mat, x + row[ k] , y + col[ k] , target) )
{
q.push ( { x + row[ k] , y + col[ k] } ) ;
}
}
}
}
// main function
int main( )
{
// matrix showing portion of the screen having different colors
char mat[ M] [ N] =
{
{ 'Y' , 'Y' , 'Y' , 'G' , 'G' , 'G' , 'G' , 'G' , 'G' , 'G' } ,
{ 'Y' , 'Y' , 'Y' , 'Y' , 'Y' , 'Y' , 'G' , 'X' , 'X' , 'X' } ,
{ 'G' , 'G' , 'G' , 'G' , 'G' , 'G' , 'G' , 'X' , 'X' , 'X' } ,
{ 'W' , 'W' , 'W' , 'W' , 'W' , 'G' , 'G' , 'G' , 'G' , 'X' } ,
{ 'W' , 'R' , 'R' , 'R' , 'R' , 'R' , 'G' , 'X' , 'X' , 'X' } ,
{ 'W' , 'W' , 'W' , 'R' , 'R' , 'G' , 'G' , 'X' , 'X' , 'X' } ,
{ 'W' , 'B' , 'W' , 'R' , 'R' , 'R' , 'R' , 'R' , 'R' , 'X' } ,
{ 'W' , 'B' , 'B' , 'B' , 'B' , 'R' , 'R' , 'X' , 'X' , 'X' } ,
{ 'W' , 'B' , 'B' , 'X' , 'B' , 'B' , 'B' , 'B' , 'X' , 'X' } ,
{ 'W' , 'B' , 'B' , 'X' , 'X' , 'X' , 'X' , 'X' , 'X' , 'X' }
} ;
// start node
int x = 3 , y = 9 ; // target color = "X"
// replacement color
char replacement = 'C' ;
// replace target color with replacement color
floodfill( mat, x, y, replacement) ;
// print the colors after replacement
for ( int i = 0 ; i < M; i++ )
{
for ( int j = 0 ; j < N; j++ )
cout << setw( 2 ) << mat[ i] [ j] ;
cout << endl;
}
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CiAKLy8gTSB4IE4gbWF0cml4CiNkZWZpbmUgTSAxMAojZGVmaW5lIE4gMTAKIAovLyBCZWxvdyBhcnJheXMgZGV0YWlscyBhbGwgOCBwb3NzaWJsZSBtb3ZlbWVudHMKaW50IHJvd1tdID0geyAtMSwgLTEsIC0xLCAgMCwgMCwgIDEsIDEsIDEgfTsKaW50IGNvbFtdID0geyAtMSwgIDAsICAxLCAtMSwgMSwgLTEsIDAsIDEgfTsKIAovLyBjaGVjayBpZiBpdCBpcyBwb3NzaWJsZSB0byBnbyB0byBwaXhlbCAoeCwgeSkgZnJvbSAKLy8gY3VycmVudCBwaXhlbC4gVGhlIGZ1bmN0aW9uIHJldHVybnMgZmFsc2UgaWYgdGhlIHBpeGVsCi8vIGhhcyBkaWZmZXJlbnQgY29sb3Igb3IgaXQgaXMgbm90IGEgdmFsaWQgcGl4ZWwKYm9vbCBpc1NhZmUoY2hhciBtYXRbTV1bTl0sIGludCB4LCBpbnQgeSwgY2hhciB0YXJnZXQpCnsKICAgIHJldHVybiB4ID49IDAgJiYgeCA8IE4gJiYgeSA+PSAwICYmIHkgPCBNIAogICAgICAgICYmIG1hdFt4XVt5XSA9PSB0YXJnZXQ7Cn0KIAovLyBGbG9vZCBmaWxsIHVzaW5nIEJGUwp2b2lkIGZsb29kZmlsbChjaGFyIG1hdFtNXVtOXSwgaW50IHgsIGludCB5LCBjaGFyIHJlcGxhY2VtZW50KQp7CSAgIAoJLy8gY3JlYXRlIGEgcXVldWUgYW5kIGVucXVldWUgc3RhcnRpbmcgcGl4ZWwKCXF1ZXVlPHBhaXI8aW50LCBpbnQ+PiBxOwoJcS5wdXNoKHt4LCB5fSk7CiAKCS8vIGdldCB0YXJnZXQgY29sb3IKCWNoYXIgdGFyZ2V0ID0gbWF0W3hdW3ldOwoJCgkvLyBydW4gdGlsbCBxdWV1ZSBpcyBub3QgZW1wdHkKCXdoaWxlICghcS5lbXB0eSgpKSAKCXsKCQkvLyBwb3AgZnJvbnQgbm9kZSBmcm9tIHF1ZXVlIGFuZCBwcm9jZXNzIGl0CgkJcGFpcjxpbnQsIGludD4gbm9kZSA9IHEuZnJvbnQoKTsKCQlxLnBvcCgpOwoJCQoJCS8vICh4LCB5KSByZXByZXNlbnRzIGN1cnJlbnQgcGl4ZWwKCQlpbnQgeCA9IG5vZGUuZmlyc3QsIHkgPSBub2RlLnNlY29uZDsKCQkKCQkvLyByZXBsYWNlIGN1cnJlbnQgcGl4ZWwgY29sb3Igd2l0aCB0aGF0IG9mIHJlcGxhY2VtZW50CgkJbWF0W3hdW3ldID0gcmVwbGFjZW1lbnQ7CgkJCgkJLy8gcHJvY2VzcyBhbGwgOCBhZGphY2VudCBwaXhlbHMgb2YgY3VycmVudCBwaXhlbCBhbmQKCQkvLyBlbnF1ZXVlIGVhY2ggdmFsaWQgcGl4ZWwKCQlmb3IgKGludCBrID0gMDsgayA8IDg7IGsrKykKCQl7CgkJCS8vIGlmIGFkamFjZW50IHBpeGVsIGF0IHBvc2l0aW9uICh4ICsgcm93W2tdLCB5ICsgY29sW2tdKSBpcwoJCQkvLyBhIHZhbGlkIHBpeGVsIGFuZCBoYXZlIHNhbWUgY29sb3IgYXMgdGhhdCBvZiBjdXJyZW50IHBpeGVsCgkJCWlmIChpc1NhZmUobWF0LCB4ICsgcm93W2tdLCB5ICsgY29sW2tdLCB0YXJnZXQpKQoJCQl7CgkJCQlxLnB1c2goe3ggKyByb3dba10sIHkgKyBjb2xba119KTsKCQkJfQoJCX0KCX0KfQogCi8vIG1haW4gZnVuY3Rpb24KaW50IG1haW4oKQp7CgkvLyBtYXRyaXggc2hvd2luZyBwb3J0aW9uIG9mIHRoZSBzY3JlZW4gaGF2aW5nIGRpZmZlcmVudCBjb2xvcnMKCWNoYXIgbWF0W01dW05dID0KCXsKCQl7ICdZJywgJ1knLCAnWScsICdHJywgJ0cnLCAnRycsICdHJywgJ0cnLCAnRycsICdHJyB9LAoJCXsgJ1knLCAnWScsICdZJywgJ1knLCAnWScsICdZJywgJ0cnLCAnWCcsICdYJywgJ1gnIH0sCgkJeyAnRycsICdHJywgJ0cnLCAnRycsICdHJywgJ0cnLCAnRycsICdYJywgJ1gnLCAnWCcgfSwKCQl7ICdXJywgJ1cnLCAnVycsICdXJywgJ1cnLCAnRycsICdHJywgJ0cnLCAnRycsICdYJyB9LAoJCXsgJ1cnLCAnUicsICdSJywgJ1InLCAnUicsICdSJywgJ0cnLCAnWCcsICdYJywgJ1gnIH0sCgkJeyAnVycsICdXJywgJ1cnLCAnUicsICdSJywgJ0cnLCAnRycsICdYJywgJ1gnLCAnWCcgfSwKCQl7ICdXJywgJ0InLCAnVycsICdSJywgJ1InLCAnUicsICdSJywgJ1InLCAnUicsICdYJyB9LAoJCXsgJ1cnLCAnQicsICdCJywgJ0InLCAnQicsICdSJywgJ1InLCAnWCcsICdYJywgJ1gnIH0sCgkJeyAnVycsICdCJywgJ0InLCAnWCcsICdCJywgJ0InLCAnQicsICdCJywgJ1gnLCAnWCcgfSwKCQl7ICdXJywgJ0InLCAnQicsICdYJywgJ1gnLCAnWCcsICdYJywgJ1gnLCAnWCcsICdYJyB9Cgl9OwoJCgkvLyBzdGFydCBub2RlIAoJaW50IHggPSAzLCB5ID0gOTsJLy8gdGFyZ2V0IGNvbG9yID0gJnF1b3Q7WCZxdW90OwoJCgkvLyByZXBsYWNlbWVudCBjb2xvcgoJY2hhciByZXBsYWNlbWVudCA9ICdDJzsKCQoJLy8gcmVwbGFjZSB0YXJnZXQgY29sb3Igd2l0aCByZXBsYWNlbWVudCBjb2xvcgoJZmxvb2RmaWxsKG1hdCwgeCwgeSwgcmVwbGFjZW1lbnQpOwoJCgkvLyBwcmludCB0aGUgY29sb3JzIGFmdGVyIHJlcGxhY2VtZW50Cglmb3IgKGludCBpID0gMDsgaSA8IE07IGkrKykgCgl7CgkJZm9yIChpbnQgaiA9IDA7IGogPCBOOyBqKyspCgkJCWNvdXQgPDwgc2V0dygyKSA8PCBtYXRbaV1bal07CgoJCWNvdXQgPDwgZW5kbDsKCX0KfQ==