#include <iostream>
#include <stack>
using Point = std::pair<int, int>;
const int W = 5;
const int H = 5;
bool m[W][H] = {{0, 0, 0, 1, 0},
{0, 0, 0, 1, 0},
{0, 0, 0, 1, 0},
{0, 0, 0, 1, 0},
{0, 0, 0, 1, 0}};
void fillUsingStack(bool m[W][H], int startX, int startY)
{
std::stack<Point> S;
S.push({startX, startY});
while (!S.empty())
{
// get top element
Point p = S.top();
S.pop();
// check boundaries
if (p.first < 0 || p.first >= W || p.second < 0 || p.second >= H)
continue;
// skip when already colored
if (m[p.first][p.second])
continue;
// color current tile
m[p.first][p.second] = 1;
// put all the neighbours on the stack
S.push({p.first + 1, p.second});
S.push({p.first - 1, p.second});
S.push({p.first, p.second + 1});
S.push({p.first, p.second - 1});
}
}
void printMap(bool m[W][H])
{
for (int y = 0; y < H; ++y)
{
for (int x = 0; x < W; ++x)
std::cout << m[x][y] ? "1 " : "0 ";
std::cout << "\n";
}
std::cout << std::endl;
}
int main() {
printMap(m);
fillUsingStack(m, 2, 2);
printMap(m);
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8c3RhY2s+Cgp1c2luZyBQb2ludCA9IHN0ZDo6cGFpcjxpbnQsIGludD47Cgpjb25zdCBpbnQgVyA9IDU7CmNvbnN0IGludCBIID0gNTsKCmJvb2wgbVtXXVtIXSA9IHt7MCwgMCwgMCwgMSwgMH0sCgkJCQl7MCwgMCwgMCwgMSwgMH0sCgkJCQl7MCwgMCwgMCwgMSwgMH0sCgkJCQl7MCwgMCwgMCwgMSwgMH0sCgkJCQl7MCwgMCwgMCwgMSwgMH19OwoJCQkJCnZvaWQgZmlsbFVzaW5nU3RhY2soYm9vbCBtW1ddW0hdLCBpbnQgc3RhcnRYLCBpbnQgc3RhcnRZKQp7CglzdGQ6OnN0YWNrPFBvaW50PiBTOwoJUy5wdXNoKHtzdGFydFgsIHN0YXJ0WX0pOwoJCgl3aGlsZSAoIVMuZW1wdHkoKSkKCXsKCQkvLyBnZXQgdG9wIGVsZW1lbnQKCQlQb2ludCBwID0gUy50b3AoKTsKCQlTLnBvcCgpOwoJCQoJCS8vIGNoZWNrIGJvdW5kYXJpZXMKCQlpZiAocC5maXJzdCA8IDAgfHwgcC5maXJzdCA+PSBXIHx8IHAuc2Vjb25kIDwgMCB8fCBwLnNlY29uZCA+PSBIKQoJCQljb250aW51ZTsKCQkKCQkvLyBza2lwIHdoZW4gYWxyZWFkeSBjb2xvcmVkCgkJaWYgKG1bcC5maXJzdF1bcC5zZWNvbmRdKQoJCQljb250aW51ZTsKCQkKCQkvLyBjb2xvciBjdXJyZW50IHRpbGUKCQltW3AuZmlyc3RdW3Auc2Vjb25kXSA9IDE7CgkJCgkJLy8gcHV0IGFsbCB0aGUgbmVpZ2hib3VycyBvbiB0aGUgc3RhY2sKCQlTLnB1c2goe3AuZmlyc3QgKyAxLCBwLnNlY29uZH0pOwoJCVMucHVzaCh7cC5maXJzdCAtIDEsIHAuc2Vjb25kfSk7CgkJUy5wdXNoKHtwLmZpcnN0LCBwLnNlY29uZCArIDF9KTsKCQlTLnB1c2goe3AuZmlyc3QsIHAuc2Vjb25kIC0gMX0pOwoJfQp9Cgp2b2lkIHByaW50TWFwKGJvb2wgbVtXXVtIXSkKewoJZm9yIChpbnQgeSA9IDA7IHkgPCBIOyArK3kpCgl7CgkJZm9yIChpbnQgeCA9IDA7IHggPCBXOyArK3gpCgkJCXN0ZDo6Y291dCA8PCBtW3hdW3ldID8gIjEgIiA6ICIwICI7CgkJc3RkOjpjb3V0IDw8ICJcbiI7Cgl9CglzdGQ6OmNvdXQgPDwgc3RkOjplbmRsOwp9CgppbnQgbWFpbigpIHsKCXByaW50TWFwKG0pOwoJCglmaWxsVXNpbmdTdGFjayhtLCAyLCAyKTsKCQoJcHJpbnRNYXAobSk7CglyZXR1cm4gMDsKfQ==