百度笔试题第二题
过了97.5%的用例,后面在思考一下哪出了问题
#include <iostream>
#include <vector>
#include <queue>
#include <map>
using namespace std;
int bfs(vector<vector<char> >& mp, map<pair<int, int>, int>& stars, int tx, int ty, map<pair<int, int>, int>& ends) {
int m = mp.size();
int n = mp[0].size();
static int dx[] = { 0, 1, 0, -1 };
static int dy[] = { -1, 0, 1, 0 };
for (auto& ps : stars) {
auto& key = ps.first;
int x = key.first, y = key.second;
vector<vector<bool> > visited(m, vector<bool>(n, false));
queue<pair<int, int> > que;
visited[x][y] = true;
que.push({ x, y });
int cnt = 0;
while (!que.empty()) {
int sz = que.size();
for (int i = 0; i < sz; ++i) {
auto& front = que.front();
int sx = front.first, sy = front.second;
for (int i = 0; i < 4; ++i) {
int nx = sx + dx[i];
int ny = sy + dy[i];
if (nx >= 0 && nx < m && ny >= 0 && ny < n) {
if (nx == tx && ny == ty) {
if (ends.find({ sx,sy }) == ends.end()) {
ends[{sx, sy}] = cnt + ps.second;
}
else {
ends[{sx, sy}] = min(ends[{sx, sy}], cnt + ps.second);
}
}
if (mp[nx][ny] == '.' && !visited[nx][ny]) {
que.push({ nx, ny });
visited[nx][ny] = true;
}
}
}
que.pop();
}
++cnt;
}
}
if (ends.empty()) {
return -1;
}
else {
return 0;
}
}
int main() {
int n, m, k;
cin >> n >> m >> k;
vector<vector<char> > mp(n, vector<char>(m));
map<pair<int, int>, int> stars;
map<pair<int, int>, int> ends;
int x, y;
int fx, fy;
vector<vector<int> > rocks;
for (int i = 0; i < n; ++i) {
for (int j = 0; j < m; ++j) {
cin >> mp[i][j];
if (mp[i][j] == 'S') {
x = i;
y = j;
mp[i][j] = '.';
stars[{x, y}] = 0;
}
if (mp[i][j] == 'F') {
fx = i;
fy = j;
mp[i][j] = '.';
}
}
}
for (int i = 0; i < k; ++i) {
int rx, ry;
cin >> rx >> ry;
rocks.push_back({ rx - 1, ry - 1 });
}
int sum = 0;
for (int i = 0; i < k; ++i) {
int sx = -1, sy = -1;
int temp = bfs(mp, stars, rocks[i][0], rocks[i][1], ends);
if (temp == -1) {
cout << -1 << endl;
return 0;
}
stars.clear();
stars = ends;
ends.clear();
}
int temp = bfs(mp, stars, fx, fy, ends);
if (temp == -1) {
cout << -1 << endl;
return 0;
}
for (auto& kv : ends) {
if(sum == 0)
sum =kv.second + 1;
else {
sum = min(sum, kv.second + 1);
}
}
cout << sum << endl;
return 0;
}