实际是一道搜多题。只不过题目叙述过于复杂,读懂后就比较好处理 程序代码: #include <iostream> #include <cstring> #include <string> #include <cstdio> #include <set> #include <map> #include <queue> #include <vector> #include <utility> #include <cmath> #include <algorithm> using namespace std; #define exp 1e-9 #define INF 1000000 typedef pair<int, int> pill; typedef struct { string name; int step; }Node; pill Begin, End; map<string, pill> mp; vector<string> vec[200], bus; set<string> LinkEnd; int vis[200]; int m, n, vMin; int dblcmp(double x) { if(x > -exp && x < exp) return 0; return x > 0 ? 1 : 0; } double CalDis(pill a, pill b) { return sqrt((a.first - b.first) * (a.first - b.first) + (a.second - b.second) * (a.second - b.second)); } void bfs() { Node u, v; queue<Node> q; map<string, int> mpv; LinkEnd.clear(); for(int i = 0; i < n; i++){ if(dblcmp(CalDis(Begin, mp[bus[i]]) - 1000) <= 0){ mpv[bus[i]] = 1; u.name = bus[i]; u.step = 1; q.push(u); } if(dblcmp(CalDis(End, mp[bus[i]]) - 1000) <= 0){ LinkEnd.insert(bus[i]); } } vMin = INF; while(!q.empty()){ u = q.front(); q.pop(); if(LinkEnd.count(u.name)){ vMin = u.step; return ; } for(int i = 0; i < m; i++){ if(!vis[i]){ if(find(vec[i].begin(), vec[i].end(), u.name) != vec[i].end()){ vis[i] = 1; for(int j = 0; j < vec[i].size(); j++){ if(mpv.count(vec[i][j])) continue; mpv[vec[i][j]] = 1; if(LinkEnd.count(vec[i][j])){ vMin = u.step; return ; }else { v = u; v.name = vec[i][j]; v.step++; q.push(v); } } } } } } } int main() { int nCase; int value, x, y, len, k; string input; //freopen("input.txt", "r", stdin); cin>>nCase; while(nCase--){ cin>>input>>x>>y; value = 5120; Begin.first = 2 * x; Begin.second = 2 * y; len = input.size(); for(int i = 0; i < len; i++){ if(input[i] == '3'){ Begin.first += value; Begin.second += value; }else if(input[i] == '2'){ Begin.first += value; }else if(input[i] == '1'){ Begin.second += value; } value /= 2; } cin>>input>>x>>y; value = 5120; End.first = 2 * x; End.second = 2 * y; len = input.size(); for(int i = 0; i < len; i++){ if(input[i] == '3'){ End.first += value; End.second += value; }else if(input[i] == '2'){ End.first += value; }else if(input[i] == '1'){ End.second += value; } value /= 2; } //cout<<End.first<<" "<<End.second<<endl; cin>>n; for(int i = 0; i < n; i++){ cin>>input>>x>>y; bus.push_back(input); mp[input].first = x; mp[input].second = y; } cin>>m; memset(vis, 0, sizeof(vis)); for(int i = 0; i < m; i++){ cin>>k; for(int j = 0; j < k; j++){ cin>>input; vec[i].push_back(input); } } if(dblcmp(CalDis(Begin, End) - 2000) <= 0){ printf("walk there/n"); }else { bfs(); if(vMin == INF) printf("take a taxi/n"); else printf("%d/n", vMin); } for(int i = 0; i < m; i++) vec[i].clear(); mp.clear(); bus.clear(); } return 0; }