#include <iostream>
#include <bits/stdc++.h>
using namespace std;
class Coordinates
{
public:
int top;
int bottom;
int left;
int right;
};
vector<pair<int,int>> findRobots (vector<vector<char>> grid,vector<int> jumps)
{
int rows = grid.size();
int cols = grid[0].size();
vector<pair<int,int>> results;
vector<vector<Coordinates>> dp (rows,vector<Coordinates>(cols));
// top and left
for(int i=0;i<rows;i++)
{
for(int j=0;j<cols;j++)
{
if( j==0 || grid[i][j-1]=='X' )
{
dp[i][j].left=1;
}
else
{
dp[i][j].left= dp[i][j-1].left + 1;
}
if(i==0 || grid[i-1][j]=='X' )
{
dp[i][j].top=1;
}
else
{
dp[i][j].top= dp[i-1][j].top + 1;
}
}
}
// bottom right
for(int i=rows-1;i>=0;i--)
{
for(int j=cols-1;j>=0;j--)
{
if(j==cols-1 || grid[i][j+1]=='X' )
{
dp[i][j].right=1;
}
else
{
dp[i][j].right= dp[i][j+1].right + 1;
}
if( i==rows-1 || grid[i+1][j]=='X' )
{
dp[i][j].bottom=1;
}
else
{
dp[i][j].bottom= dp[i+1][j].bottom + 1;
}
}
}
int topV = jumps[1];
int bottomV= jumps[2];
int rightV = jumps[3];
int leftV = jumps[0];
for(int i=0;i<rows;i++)
{
for(int j=0;j<cols;j++)
{
if(grid[i][j] == 'O' && dp[i][j].top == topV && dp[i][j].bottom == bottomV && dp[i][j] .left == leftV && dp[i][j].right == rightV)
{
results.push_back({i,j});
}
}
}
return results;
}
int main() {
// your code goes here
vector<vector<char>> grid = {{'O','E','E','E','X'},{'E','O','X','X','X'},{'E','E','E','E','E'},{'X','E','O','E','E'},{'X','E','X','E','X'}};
vector<int> jumps = {2, 2, 4, 1};
vector<pair<int,int>> results = findRobots(grid,jumps);
for(auto it : results )
{
cout<<it.first<<","<<it.second<<"\n";
}
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8Yml0cy9zdGRjKysuaD4KdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCmNsYXNzIENvb3JkaW5hdGVzCnsKCXB1YmxpYzoKCWludCB0b3A7CglpbnQgYm90dG9tOwoJaW50IGxlZnQ7CglpbnQgcmlnaHQ7Cn07CnZlY3RvcjxwYWlyPGludCxpbnQ+PiBmaW5kUm9ib3RzICh2ZWN0b3I8dmVjdG9yPGNoYXI+PiBncmlkLHZlY3RvcjxpbnQ+IGp1bXBzKQp7CglpbnQgcm93cyA9IGdyaWQuc2l6ZSgpOwoJaW50IGNvbHMgPSBncmlkWzBdLnNpemUoKTsKCXZlY3RvcjxwYWlyPGludCxpbnQ+PiByZXN1bHRzOwoJdmVjdG9yPHZlY3RvcjxDb29yZGluYXRlcz4+IGRwIChyb3dzLHZlY3RvcjxDb29yZGluYXRlcz4oY29scykpOyAKCS8vIHRvcCBhbmQgbGVmdAoJZm9yKGludCBpPTA7aTxyb3dzO2krKykKCXsKCQlmb3IoaW50IGo9MDtqPGNvbHM7aisrKQoJCXsKCQkJaWYoIGo9PTAgfHwgZ3JpZFtpXVtqLTFdPT0nWCcgKQoJCQl7CgkJCQlkcFtpXVtqXS5sZWZ0PTE7CgkJCX0KCQkJZWxzZQoJCQl7CgkJCQlkcFtpXVtqXS5sZWZ0PSBkcFtpXVtqLTFdLmxlZnQgKyAxOwoJCQl9CgkJCQoJCQlpZihpPT0wIHx8IGdyaWRbaS0xXVtqXT09J1gnICkKCQkJewoJCQkJZHBbaV1bal0udG9wPTE7CgkJCX0KCQkJZWxzZQoJCQl7CgkJCQlkcFtpXVtqXS50b3A9IGRwW2ktMV1bal0udG9wICsgMTsKCQkJfQoJCX0KCX0KCQoJLy8gYm90dG9tIHJpZ2h0CgkKCWZvcihpbnQgaT1yb3dzLTE7aT49MDtpLS0pCgl7CgkJZm9yKGludCBqPWNvbHMtMTtqPj0wO2otLSkKCQl7CgkJCWlmKGo9PWNvbHMtMSB8fCBncmlkW2ldW2orMV09PSdYJyApCgkJCXsKCQkJCWRwW2ldW2pdLnJpZ2h0PTE7CgkJCX0KCQkJZWxzZQoJCQl7CgkJCQlkcFtpXVtqXS5yaWdodD0gZHBbaV1baisxXS5yaWdodCArIDE7CgkJCX0KCQkJCgkJCWlmKCBpPT1yb3dzLTEgfHwgZ3JpZFtpKzFdW2pdPT0nWCcgKQoJCQl7CgkJCQlkcFtpXVtqXS5ib3R0b209MTsKCQkJfQoJCQllbHNlCgkJCXsKCQkJCWRwW2ldW2pdLmJvdHRvbT0gZHBbaSsxXVtqXS5ib3R0b20gKyAxOwoJCQl9CgkJfQoJfQoJCglpbnQgdG9wViA9IGp1bXBzWzFdOwoJaW50IGJvdHRvbVY9IGp1bXBzWzJdOwoJaW50IHJpZ2h0ViA9IGp1bXBzWzNdOwoJaW50IGxlZnRWID0ganVtcHNbMF07CgkKCWZvcihpbnQgaT0wO2k8cm93cztpKyspCgl7CgkJZm9yKGludCBqPTA7ajxjb2xzO2orKykKCQl7CgkJCWlmKGdyaWRbaV1bal0gPT0gJ08nICYmIGRwW2ldW2pdLnRvcCA9PSB0b3BWICYmIGRwW2ldW2pdLmJvdHRvbSA9PSBib3R0b21WICYmIGRwW2ldW2pdIC5sZWZ0ID09IGxlZnRWICYmIGRwW2ldW2pdLnJpZ2h0ID09IHJpZ2h0VikKCQkJewoJCQkJcmVzdWx0cy5wdXNoX2JhY2soe2ksan0pOwoJCQl9CgkJCQoJCX0KCX0KCQoJCgkKCXJldHVybiByZXN1bHRzOwoJCn0KCmludCBtYWluKCkgewoJLy8geW91ciBjb2RlIGdvZXMgaGVyZQoJdmVjdG9yPHZlY3RvcjxjaGFyPj4gZ3JpZCA9IHt7J08nLCdFJywnRScsJ0UnLCdYJ30seydFJywnTycsJ1gnLCdYJywnWCd9LHsnRScsJ0UnLCdFJywnRScsJ0UnfSx7J1gnLCdFJywnTycsJ0UnLCdFJ30seydYJywnRScsJ1gnLCdFJywnWCd9fTsKCXZlY3RvcjxpbnQ+IGp1bXBzID0gezIsIDIsIDQsIDF9OwoJdmVjdG9yPHBhaXI8aW50LGludD4+IHJlc3VsdHMgPSBmaW5kUm9ib3RzKGdyaWQsanVtcHMpOwoJZm9yKGF1dG8gaXQgOiByZXN1bHRzICkKCXsKCQljb3V0PDxpdC5maXJzdDw8IiwiPDxpdC5zZWNvbmQ8PCJcbiI7Cgl9CglyZXR1cm4gMDsKfQ==