Ranking (as of 2014-11-30): 74 out of 517
Language: C++
/* UVa 10977 - Enchanted Forest To build using Visual Studio 2012: cl -EHsc -O2 UVa_10977_Enchanted_Forest.cpp */ #include <iostream> #include <queue> #include <utility> #include <algorithm> using namespace std; const int R_max = 200, C_max = 200; bool grid[R_max + 1][C_max + 1]; bool visited[R_max + 1][C_max + 1]; const int nr_dirs = 4; pair<int, int> dirs[nr_dirs] = {make_pair(1, 0), make_pair(0, 1), make_pair(-1, 0), make_pair(0, -1)}; int main() { while (true) { int R, C; cin >> R >> C; if (!R && !C) break; for (int r = 1; r <= R; r++) for (int c = 1; c <= C; c++) { grid[r][c] = true; visited[r][c] = false; } int m; cin >> m; while (m--) { int r, c; cin >> r >> c; grid[r][c] = false; } int n; cin >> n; while (n--) { int r, c, L; cin >> r >> c >> L; if (!L) // L should be greater than zero continue; int rs = max(r - L, 1), re = min(r + L, R), cs = max(c - L, 1), ce = min(c + L, C), ls = L * L; for (int i = rs; i <= re; i++) for (int j = cs; j <= ce; j++) if ((i - r) * (i - r) + (j - c) * (j - c) <= ls) grid[i][j] = false; } #ifdef DEBUG for (int r = 1; r <= R; r++) { for (int c = 1; c <= C; c++) cout << grid[r][c] << ' '; cout << endl; } #endif /* if (R == 1 && C == 1) { // already left the forest cout << 0 << endl; continue; } */ // breadth-first search queue< pair< pair<int, int>, int> > q; bool impossible = true; int path = 0; if (grid[1][1]) { visited[1][1] = true; q.push(make_pair(make_pair(1, 1), path)); } while (!q.empty()) { pair< pair<int, int>, int> p = q.front(); q.pop(); path = p.second; if (p.first.first == R && p.first.second == C) { impossible = false; break; } path++; for (int i = 0; i < nr_dirs; i++) { int r = p.first.first + dirs[i].first, c = p.first.second + dirs[i].second; if (r >= 1 && r <= R && c >= 1 && c <= C && grid[r][c] && !visited[r][c]) { visited[r][c] = true; q.push(make_pair(make_pair(r, c), path)); } } } if (impossible) cout << "Impossible.\n"; else cout << path << endl; } return 0; }
No comments:
Post a Comment