Ranking (as of 2013-11-23): 94 out of 637
Language: C++
/* UVa 10610 - Gopher and Hawks To build using Visual Studio 2012: cl -EHsc -O2 UVa_10610_Gopher_and_Hawks.cpp */ #include <iostream> #include <string> #include <sstream> #include <vector> #include <queue> #include <utility> #include <cmath> using namespace std; const int n_max = 1024; // when I defined n_max = 1000, I got a verdict of Runtime error. pair<double, double> holes[n_max]; vector<int> edges[n_max]; bool visited[n_max]; double euclidean_distance(const pair<double, double>& p, const pair<double, double>& q) { double dx = p.first - q.first, dy = p.second - q.second; return sqrt(dx * dx + dy * dy); } int bfs(int n, int s, int t, const vector<int> edges[]) { queue< pair<int, int> > q; visited[s] = true; q.push(make_pair(s, 0)); while (!q.empty()) { pair<int, int> u = q.front(); q.pop(); if (u.first == t) return u.second - 1; const vector<int>& e = edges[u.first]; for (size_t i = 0, j = e.size(); i < j; i++) { int k = e[i]; if (!visited[k]) { visited[k] = true; q.push(make_pair(k, u.second + 1)); } } } return -1; } int main() { string line; istringstream iss; while (true) { getline(cin, line); iss.str(line); int v, m; iss >> v >> m; iss.clear(); if (!v && !m) break; double d = 60.0 * v * m; int n = 0; while (true) { getline(cin, line); if (line.empty()) break; iss.str(line); iss >> holes[n].first >> holes[n].second; iss.clear(); n++; } for (int i = 0; i < n; i++) { edges[i].clear(); visited[i] = false; } for (int i = 0; i < n - 1; i++) for (int j = i + 1; j < n; j++) if (euclidean_distance(holes[i], holes[j]) <= d) { edges[i].push_back(j); edges[j].push_back(i); } int nr_holes = bfs(n, 0, 1, edges); if (nr_holes != -1) cout << "Yes, visiting " << nr_holes << " other holes.\n"; else cout << "No.\n"; } return 0; }