11
node2(int xx, int yy, int dd) {19
vector<vector<int>> dfn;20
vector<vector<vector<int>>> color;21
vector<vector<vector<bool>>> cover;22
vector<vector<int>> mi;23
vector<vector<char>> grid;24
int dir[4][2] = {{0, 1}, {0, -1}, {1, 0}, {-1, 0}};27
vector<vector<bool>> ins;31
void dfs(int x, int y, int last_dir) {32
dfn[x][y] = mi[x][y] = ++id;35
for (i = 0; i < 4; i++) {36
if ((last_dir ^ 1) == i) {43
if (nx >= 0 && nx < n && ny >= 0 && ny < m && grid[nx][ny] != '#') {44
if (cover[x][y][i] == 0 && cover[nx][ny][i ^ 1] == 0) {45
st.push(node2(x, y, i));46
cover[x][y][i] = cover[nx][ny][i ^ 1] = 1;48
if (dfn[nx][ny] == 0) {50
if (dfn[x][y] <= mi[nx][ny]) {55
color[now.x][now.y][now.dir] = sid;56
color[now.x + dir[now.dir][0]][now.y + dir[now.dir][1]][now.dir ^ 1] = sid;57
} while (now.x != x || now.y != y || now.dir != i);60
mi[x][y] = min(mi[x][y], mi[nx][ny]);61
} else // if(ins[nx][ny]==1)63
mi[x][y] = min(mi[x][y], dfn[nx][ny]);71
int minPushBox(vector<vector<char>> &grid) {76
dfn = vector<vector<int>>(n, vector<int>(m, 0));77
color = vector<vector<vector<int>>>(n, vector<vector<int>>(m, vector<int>(4, 0)));78
cover = vector<vector<vector<bool>>>(n, vector<vector<bool>>(m, vector<bool>(4, 0)));79
mi = vector<vector<int>>(n, vector<int>(m, INT_MAX));80
ins = vector<vector<bool>>(n, vector<bool>(m, 0));83
for (i = 0; i < n; i++) {84
for (j = 0; j < m; j++) {85
if (grid[i][j] != '#' && dfn[i][j] == 0) {91
int sx, sy, ex, ey, bx, by;92
for (i = 0; i < n; i++) {93
for (j = 0; j < m; j++) {94
if (grid[i][j] == 'S') {99
if (grid[i][j] == 'T') {104
if (grid[i][j] == 'B') {111
ins = vector<vector<bool>>(n, vector<bool>(m, 0));114
q.push(node(sx, sy));117
memset(dp, -1, sizeof(dp));120
node now = q.front();122
for (i = 0; i < 4; i++) {124
nx = now.x + dir[i][0];125
ny = now.y + dir[i][1];126
if (nx >= 0 && nx < n && ny >= 0 && ny < m) {127
if (nx == bx && ny == by) {128
dp[bx][by][i ^ 1] = 0;129
q2.push(node2(bx, by, i ^ 1));130
} else if (grid[nx][ny] != '#' && ins[nx][ny] == 0) {132
q.push(node(nx, ny));138
while (!q2.empty()) {139
node2 now = q2.front();142
if (now.x == ex && now.y == ey) {143
return dp[now.x][now.y][now.dir];148
for (i = 0; i < 4; i++) {153
nx = now.x + dir[i][0];154
ny = now.y + dir[i][1];155
if (nx >= 0 && nx < n && ny >= 0 && ny < m && grid[nx][ny] != '#' &&156
dp[now.x][now.y][i] == -1 && color[now.x][now.y][now.dir] == color[now.x][now.y][i]) {157
dp[now.x][now.y][i] = dp[now.x][now.y][now.dir];158
q2.push(node2(now.x, now.y, i));162
int d = (now.dir ^ 1);163
nx = now.x + dir[d][0];164
ny = now.y + dir[d][1];165
if (nx >= 0 && nx < n && ny >= 0 && ny < m && grid[nx][ny] != '#' &&166
dp[nx][ny][now.dir] == -1) {167
dp[nx][ny][now.dir] = dp[now.x][now.y][now.dir] + 1;168
q2.push(node2(nx, ny, now.dir));