#include using namespace std; vector lines; #define R(x, y) rets.push_back(make_pair(r + x, c + y)) vector> findcons(int r, int c) { vector> rets; switch (lines[r][c]) { case '|': R(-1, 0); R(1, 0); break; case '-': R(0, -1); R(0, 1); break; case 'L': R(-1, 0); R(0, 1); break; case 'J': R(-1, 0); R(0, -1); break; case '7': R(1, 0); R(0, -1); break; case 'F': R(1, 0); R(0, 1); break; case 'S': for (int rr = -1; rr <= 1; rr++) { for (int cc = -1; cc <= 1; cc++) { if (rr == 0 && cc == 0) continue; unsigned int rrr = r + rr, ccc = c + cc; if ((int)rrr < 0 || rrr == lines.size() || (int)ccc < 0 || ccc == lines[rrr].size()) continue; for (auto& con : findcons(rrr, ccc)) { if (con.first == r && con.second == c) { R(rr, cc); goto lend; } } } } lend: break; } return rets; } #undef R int main() { ios::sync_with_stdio(0); cin.tie(0); string line; while (getline(cin, line) && !line.empty()) { lines.push_back(line); } int sr = 0, sc = 0; for (unsigned int rr = 0; rr < lines.size(); rr++) { for (unsigned int cc = 0; cc < lines[rr].size(); cc++) { if (lines[rr][cc] == 'S') { sr = rr; sc = cc; goto lend; } } } lend: const auto& scons = findcons(sr, sc); int lr = sr, lc = sc, r = scons[0].first, c = scons[0].second; bool path[lines.size()][lines[0].size()]; memset(path, 0, lines.size() * lines[0].size() * sizeof(bool)); path[r][c] = true; bool others[3][3] = {}; others[r - sr + 1][c - sc + 1] = true; do { for (auto& con : findcons(r, c)) { if (con.first == lr && con.second == lc) continue; lr = r; lc = c; r = con.first; c = con.second; path[r][c] = true; break; } } while (r != sr || c != sc); others[lr - sr + 1][lc - sc + 1] = true; int ret = 0; for (unsigned int r = 0; r < lines.size(); r++) { bool inside = false, realinside = false; char le = '\0'; for (unsigned int c = 0; c < lines[r].size(); c++) { if (path[r][c]) { char ch = lines[r][c]; sstart: switch (ch) { case 'S': if (others[1][2]) { if (others[1][0]) break; if (others[0][1]) { ch = 'L'; } else { ch = 'F'; } } else if (others[1][0]) { if (others[0][1]) { ch = 'J'; } else { ch = '7'; } } else { ch = '|'; } goto sstart; case 'L': case 'F': le = ch; break; case 'J': case '7': if ((le == 'L' && ch == 'J') || (le == 'F' && ch == '7')) break; // fallthrough case '|': inside = !inside; realinside = inside && !realinside; break; } } else if (realinside) { ret++; } } } cout << ret << '\n'; }