1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79
| #include <bits/stdc++.h> using namespace std; const int maxn = 5e2 + 50; int r, c, d[maxn][maxn]; char s[maxn][maxn]; vector<pair<pair<int, int>, int>> p[maxn][maxn]; bool v[maxn][maxn]; deque<pair<int, int>> q;
void add(int x1, int y1, int x2, int y2, int z) { p[x1][y1].push_back(make_pair(make_pair(x2, y2), z)); }
void init() { memset(v, 0, sizeof(v)); for (int i = 0; i <= r; ++i) { for (int j = 0; j <= c; ++j) { p[i][j].clear(); } } q.clear(); for (int i = 1; i <= r; ++i) { for (int j = 1; j <= c; ++j) { if (s[i][j] == '/') { add(i - 1, j - 1, i, j, 1); add(i, j, i - 1, j - 1, 1); add(i, j - 1, i - 1, j, 0); add(i - 1, j, i, j - 1, 0); } else { add(i - 1, j - 1, i, j, 0); add(i, j, i - 1, j - 1, 0); add(i, j - 1, i - 1, j, 1); add(i - 1, j, i, j - 1, 1); } } } memset(d, 0x3f, sizeof(d)); }
void dijkstra() { d[0][0] = 0; q.push_back(make_pair(0, 0)); while (!q.empty()) { int x = q.front().first, y = q.front().second; q.pop_front(); v[x][y] = 1; if (x == r && y == c) { cout << d[r][c] << endl; return; } for (auto it : p[x][y]) { int nx = it.first.first, ny = it.first.second, nz = it.second; if (v[nx][ny]) continue; if (d[x][y] + nz < d[nx][ny]) { d[nx][ny] = d[x][y] + nz; if (nz) { q.push_back(make_pair(nx, ny)); } else { q.push_front(make_pair(nx, ny)); } } } } }
int main() { int n; cin >> n; while (n--) { cin >> r >> c; for (int i = 1; i <= r; ++i) cin >> (s[i] + 1); if ((r & 1) != (c & 1)) { cout << "NO SOLUTION" << endl; continue; } init(), dijkstra(); } return 0; }
|