// author: anil_1
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
class Cell {
public:
int row, col, jumps;
bool r = false, c = false;
Cell(int _row, int _col, int _jumps, bool _r, bool _c):
row{_row}, col{_col}, jumps{_jumps}, r{_r}, c{_c} {
}
void debug() {
cout << row << ' ' << col << ' ' << r << ' ' << c << ' ' << jumps << '\n';
}
};
int getMinJumps(vector<string>& grid) {
int n = grid.size(), m = grid[0].size();
int rs = -1, cs = -1;
for(int i = 0; i < n; i++) {
for(int j = 0; i < m; j++) {
if(grid[i][j] == 'S') {
rs = i, cs = j;
break;
}
}
if(rs != -1) break;
}
grid[rs][cs] = '*';
queue<Cell> q;
vector<vector<vector<int>>> dp(n, vector<vector<int>>(m, vector<int>(4, 1 << 30)));
vector<vector<vector<bool>>> seen(n, vector<vector<bool>>(m, vector<bool>(4)));
for(int i = 0; i < n; i++) {
for(int j = 0; j < m; j++) {
if(grid[i][j] == 'E') {
q.push(Cell(i, j, 0, true, true));
dp[i][j][1] = dp[i][j][3] = 0;
seen[i][j][1] = seen[i][j][3] = true;
break;
}
}
}
//{row, row-1, col, col - 1}
while(!q.empty()) {
Cell c = q.front();
// c.debug();
q.pop();
if(c.c) {
if(c.row - 1 >= 0 && !seen[c.row - 1][c.col][1] && grid[c.row - 1][c.col] == '*'
&& dp[c.row - 1][c.col][1] >= c.jumps + 1) {
// push to queue
q.push(Cell(c.row - 1, c.col, c.jumps + 1, true, false));
dp[c.row - 1][c.col][1] = c.jumps + 1;
seen[c.row - 1][c.col][1] = true;
}
if(c.row + 1 < n && !seen[c.row + 1][c.col][1] && grid[c.row + 1][c.col] == '*'
&& dp[c.row + 1][c.col][1] >= c.jumps + 1) {
// push to queue
q.push(Cell(c.row + 1, c.col, c.jumps + 1, true, false));
dp[c.row + 1][c.col][1] = c.jumps + 1;
seen[c.row + 1][c.col][1] = true;
}
} else {
// cover whole col
for(int i = 0; i < n; i++) {
if(i == c.row or grid[i][c.col] != '*' or seen[i][c.col][1]
or dp[i][c.col][1] < c.jumps + 1) continue;
// push to queue
q.push(Cell(i, c.col, c.jumps + 1, true, false));
dp[i][c.col][1] = c.jumps + 1;
seen[i][c.col][1] = true;
}
}
if(c.r) {
if(c.col - 1 >= 0 && !seen[c.row][c.col - 1][3] && grid[c.row][c.col - 1] == '*'
&& dp[c.row][c.col - 1][3] >= c.jumps + 1) {
// push to queue
q.push(Cell(c.row, c.col - 1, c.jumps + 1, false, true));
dp[c.row][c.col - 1][3] = c.jumps + 1;
seen[c.row][c.col - 1][3] = true;
}
if(c.col + 1 < m && !seen[c.row][c.col + 1][3] && grid[c.row][c.col + 1] == '*'
&& dp[c.row][c.col + 1][3] >= c.jumps + 1) {
// push to queue
q.push(Cell(c.row, c.col + 1, c.jumps + 1, false, true));
dp[c.row][c.col + 1][3] = c.jumps + 1;
seen[c.row][c.col + 1][3] = true;
}
} else {
// cover whole row
for(int j = 0; j < m; j++) {
if(j == c.col or grid[c.row][j] != '*' or seen[c.row][j][3]
or dp[c.row][j][3] < c.jumps + 1) continue;
// push to queue
q.push(Cell(c.row, j, c.jumps + 1, false, true));
dp[c.row][j][1] = c.jumps + 1;
seen[c.row][j][3] = true;
}
}
}
int ans = *min_element(dp[rs][cs].begin(), dp[rs][cs].end());
if(ans == (1 << 30)) ans = -1;
return ans;
}
int main() {
ios_base::sync_with_stdio(false);
cin.tie(nullptr);
vector<string> grid = {
"S****#",
"**#***",
"*****#",
"#****E"
};
cout << getMinJumps(grid) << '\n';
grid = {
"S******",
"#######",
"######*",
"######E"
};
cout << getMinJumps(grid) << '\n';
grid = {
"S#",
"#E"
};
cout << getMinJumps(grid) << '\n';
grid = {
"S#**",
"#E**"
}; // answer should be 4 for this
cout << getMinJumps(grid) << '\n';
return 0;
}
Ly8gYXV0aG9yOiAgYW5pbF8xCiNpbmNsdWRlPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7Cgp0eXBlZGVmIGxvbmcgbG9uZyBsbDsKCmNsYXNzIENlbGwgewpwdWJsaWM6CiAgICBpbnQgcm93LCBjb2wsIGp1bXBzOwogICAgYm9vbCByID0gZmFsc2UsIGMgPSBmYWxzZTsKICAgIENlbGwoaW50IF9yb3csIGludCBfY29sLCBpbnQgX2p1bXBzLCBib29sIF9yLCBib29sIF9jKTogCiAgICAgICAgcm93e19yb3d9LCBjb2x7X2NvbH0sIGp1bXBze19qdW1wc30sIHJ7X3J9LCBje19jfSB7CgogICAgfQogICAgdm9pZCBkZWJ1ZygpIHsKICAgICAgICBjb3V0IDw8IHJvdyA8PCAnICcgPDwgY29sIDw8ICcgJyA8PCByIDw8ICcgJyA8PCBjIDw8ICcgJyA8PCBqdW1wcyA8PCAnXG4nOwogICAgfQp9OwoKCmludCBnZXRNaW5KdW1wcyh2ZWN0b3I8c3RyaW5nPiYgZ3JpZCkgewogICAgaW50IG4gPSBncmlkLnNpemUoKSwgbSA9IGdyaWRbMF0uc2l6ZSgpOwogICAgaW50IHJzID0gLTEsIGNzID0gLTE7CiAgICBmb3IoaW50IGkgPSAwOyBpIDwgbjsgaSsrKSB7CiAgICAgICAgZm9yKGludCBqID0gMDsgaSA8IG07IGorKykgewogICAgICAgICAgICBpZihncmlkW2ldW2pdID09ICdTJykgewogICAgICAgICAgICAgICAgcnMgPSBpLCBjcyA9IGo7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZihycyAhPSAtMSkgYnJlYWs7CiAgICB9CiAgICBncmlkW3JzXVtjc10gPSAnKic7CiAgICBxdWV1ZTxDZWxsPiBxOwogICAgdmVjdG9yPHZlY3Rvcjx2ZWN0b3I8aW50Pj4+IGRwKG4sIHZlY3Rvcjx2ZWN0b3I8aW50Pj4obSwgdmVjdG9yPGludD4oNCwgMSA8PCAzMCkpKTsKICAgIHZlY3Rvcjx2ZWN0b3I8dmVjdG9yPGJvb2w+Pj4gc2VlbihuLCB2ZWN0b3I8dmVjdG9yPGJvb2w+PihtLCB2ZWN0b3I8Ym9vbD4oNCkpKTsKICAgIGZvcihpbnQgaSA9IDA7IGkgPCBuOyBpKyspIHsKICAgICAgICBmb3IoaW50IGogPSAwOyBqIDwgbTsgaisrKSB7ICAgCiAgICAgICAgICAgIGlmKGdyaWRbaV1bal0gPT0gJ0UnKSB7CiAgICAgICAgICAgICAgICBxLnB1c2goQ2VsbChpLCBqLCAwLCB0cnVlLCB0cnVlKSk7CiAgICAgICAgICAgICAgICBkcFtpXVtqXVsxXSA9IGRwW2ldW2pdWzNdID0gMDsKICAgICAgICAgICAgICAgIHNlZW5baV1bal1bMV0gPSBzZWVuW2ldW2pdWzNdID0gdHJ1ZTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgLy97cm93LCByb3ctMSwgY29sLCBjb2wgLSAxfQogICAgd2hpbGUoIXEuZW1wdHkoKSkgewogICAgICAgIENlbGwgYyA9IHEuZnJvbnQoKTsKICAgICAgICAvLyBjLmRlYnVnKCk7CiAgICAgICAgcS5wb3AoKTsKCiAgICAgICAgaWYoYy5jKSB7CiAgICAgICAgICAgIGlmKGMucm93IC0gMSA+PSAwICYmICFzZWVuW2Mucm93IC0gMV1bYy5jb2xdWzFdICYmIGdyaWRbYy5yb3cgLSAxXVtjLmNvbF0gPT0gJyonCiAgICAgICAgICAgICAgICAmJiBkcFtjLnJvdyAtIDFdW2MuY29sXVsxXSA+PSBjLmp1bXBzICsgMSkgewogICAgICAgICAgICAgICAgLy8gcHVzaCB0byBxdWV1ZQogICAgICAgICAgICAgICAgcS5wdXNoKENlbGwoYy5yb3cgLSAxLCBjLmNvbCwgYy5qdW1wcyArIDEsIHRydWUsIGZhbHNlKSk7CiAgICAgICAgICAgICAgICBkcFtjLnJvdyAtIDFdW2MuY29sXVsxXSA9IGMuanVtcHMgKyAxOwogICAgICAgICAgICAgICAgc2VlbltjLnJvdyAtIDFdW2MuY29sXVsxXSA9IHRydWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYoYy5yb3cgKyAxIDwgbiAmJiAhc2VlbltjLnJvdyArIDFdW2MuY29sXVsxXSAmJiBncmlkW2Mucm93ICsgMV1bYy5jb2xdID09ICcqJwogICAgICAgICAgICAgICAgJiYgZHBbYy5yb3cgKyAxXVtjLmNvbF1bMV0gPj0gYy5qdW1wcyArIDEpIHsKICAgICAgICAgICAgICAgIC8vIHB1c2ggdG8gcXVldWUKICAgICAgICAgICAgICAgIHEucHVzaChDZWxsKGMucm93ICsgMSwgYy5jb2wsIGMuanVtcHMgKyAxLCB0cnVlLCBmYWxzZSkpOwogICAgICAgICAgICAgICAgZHBbYy5yb3cgKyAxXVtjLmNvbF1bMV0gPSBjLmp1bXBzICsgMTsKICAgICAgICAgICAgICAgIHNlZW5bYy5yb3cgKyAxXVtjLmNvbF1bMV0gPSB0cnVlOwogICAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgLy8gY292ZXIgd2hvbGUgY29sCiAgICAgICAgICAgIGZvcihpbnQgaSA9IDA7IGkgPCBuOyBpKyspIHsKICAgICAgICAgICAgICAgIGlmKGkgPT0gYy5yb3cgb3IgZ3JpZFtpXVtjLmNvbF0gIT0gJyonIG9yIHNlZW5baV1bYy5jb2xdWzFdCiAgICAgICAgICAgICAgICAgICAgb3IgZHBbaV1bYy5jb2xdWzFdIDwgYy5qdW1wcyArIDEpIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgLy8gcHVzaCB0byBxdWV1ZQogICAgICAgICAgICAgICAgcS5wdXNoKENlbGwoaSwgYy5jb2wsIGMuanVtcHMgKyAxLCB0cnVlLCBmYWxzZSkpOwogICAgICAgICAgICAgICAgZHBbaV1bYy5jb2xdWzFdID0gYy5qdW1wcyArIDE7CiAgICAgICAgICAgICAgICBzZWVuW2ldW2MuY29sXVsxXSA9IHRydWU7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgCiAgICAgICAgaWYoYy5yKSB7CiAgICAgICAgICAgIGlmKGMuY29sIC0gMSA+PSAwICYmICFzZWVuW2Mucm93XVtjLmNvbCAtIDFdWzNdICYmIGdyaWRbYy5yb3ddW2MuY29sIC0gMV0gPT0gJyonCiAgICAgICAgICAgICAgICAmJiBkcFtjLnJvd11bYy5jb2wgLSAxXVszXSA+PSBjLmp1bXBzICsgMSkgewogICAgICAgICAgICAgICAgLy8gcHVzaCB0byBxdWV1ZQogICAgICAgICAgICAgICAgcS5wdXNoKENlbGwoYy5yb3csIGMuY29sIC0gMSwgYy5qdW1wcyArIDEsIGZhbHNlLCB0cnVlKSk7CiAgICAgICAgICAgICAgICBkcFtjLnJvd11bYy5jb2wgLSAxXVszXSA9IGMuanVtcHMgKyAxOwogICAgICAgICAgICAgICAgc2VlbltjLnJvd11bYy5jb2wgLSAxXVszXSA9IHRydWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYoYy5jb2wgKyAxIDwgbSAmJiAhc2VlbltjLnJvd11bYy5jb2wgKyAxXVszXSAmJiBncmlkW2Mucm93XVtjLmNvbCArIDFdID09ICcqJwogICAgICAgICAgICAgICAgJiYgZHBbYy5yb3ddW2MuY29sICsgMV1bM10gPj0gYy5qdW1wcyArIDEpIHsKICAgICAgICAgICAgICAgIC8vIHB1c2ggdG8gcXVldWUKICAgICAgICAgICAgICAgIHEucHVzaChDZWxsKGMucm93LCBjLmNvbCArIDEsIGMuanVtcHMgKyAxLCBmYWxzZSwgdHJ1ZSkpOwogICAgICAgICAgICAgICAgZHBbYy5yb3ddW2MuY29sICsgMV1bM10gPSBjLmp1bXBzICsgMTsKICAgICAgICAgICAgICAgIHNlZW5bYy5yb3ddW2MuY29sICsgMV1bM10gPSB0cnVlOwogICAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgLy8gY292ZXIgd2hvbGUgcm93CiAgICAgICAgICAgIGZvcihpbnQgaiA9IDA7IGogPCBtOyBqKyspIHsKICAgICAgICAgICAgICAgIGlmKGogPT0gYy5jb2wgb3IgZ3JpZFtjLnJvd11bal0gIT0gJyonIG9yIHNlZW5bYy5yb3ddW2pdWzNdCiAgICAgICAgICAgICAgICAgICAgb3IgZHBbYy5yb3ddW2pdWzNdIDwgYy5qdW1wcyArIDEpIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgLy8gcHVzaCB0byBxdWV1ZQogICAgICAgICAgICAgICAgcS5wdXNoKENlbGwoYy5yb3csIGosIGMuanVtcHMgKyAxLCBmYWxzZSwgdHJ1ZSkpOwogICAgICAgICAgICAgICAgZHBbYy5yb3ddW2pdWzFdID0gYy5qdW1wcyArIDE7CiAgICAgICAgICAgICAgICBzZWVuW2Mucm93XVtqXVszXSA9IHRydWU7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICBpbnQgYW5zID0gKm1pbl9lbGVtZW50KGRwW3JzXVtjc10uYmVnaW4oKSwgZHBbcnNdW2NzXS5lbmQoKSk7CiAgICBpZihhbnMgPT0gKDEgPDwgMzApKSBhbnMgPSAtMTsKICAgIHJldHVybiBhbnM7Cn0KCmludCBtYWluKCkgewogICAgaW9zX2Jhc2U6OnN5bmNfd2l0aF9zdGRpbyhmYWxzZSk7CiAgICBjaW4udGllKG51bGxwdHIpOwogICAgdmVjdG9yPHN0cmluZz4gZ3JpZCA9IHsKICAgICAgICAiUyoqKiojIiwgCiAgICAgICAgIioqIyoqKiIsIAogICAgICAgICIqKioqKiMiLCAKICAgICAgICAiIyoqKipFIgogICAgfTsKICAgIGNvdXQgPDwgZ2V0TWluSnVtcHMoZ3JpZCkgPDwgJ1xuJzsKICAgIGdyaWQgPSB7CiAgICAgICAgIlMqKioqKioiLCAKICAgICAgICAiIyMjIyMjIyIsIAogICAgICAgICIjIyMjIyMqIiwgCiAgICAgICAgIiMjIyMjI0UiCiAgICB9OwogICAgY291dCA8PCBnZXRNaW5KdW1wcyhncmlkKSA8PCAnXG4nOwogICAgZ3JpZCA9IHsKICAgICAgICAiUyMiLCAKICAgICAgICAiI0UiCiAgICB9OwogICAgY291dCA8PCBnZXRNaW5KdW1wcyhncmlkKSA8PCAnXG4nOwogICAgZ3JpZCA9IHsKICAgICAgICAiUyMqKiIsIAogICAgICAgICIjRSoqIgogICAgfTsgLy8gYW5zd2VyIHNob3VsZCBiZSA0IGZvciB0aGlzCiAgICBjb3V0IDw8IGdldE1pbkp1bXBzKGdyaWQpIDw8ICdcbic7CiAgICByZXR1cm4gMDsKfQ==