百度笔试题第二题

过了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;
}
全部评论
牛啊老哥
点赞 回复 分享
发布于 2022-04-12 23:21

相关推荐

喜欢核冬天的哈基米很想上市:会爆NullPointerException的
点赞 评论 收藏
分享
用户64975461947315:这不很正常吗,2个月开实习证明,这个薪资也还算合理,深圳Java好多150不包吃不包住呢,而且也提前和你说了没有转正机会,现在贼多牛马公司骗你说毕业转正,你辛辛苦苦干了半年拿到毕业证,后面和你说没hc了😂
点赞 评论 收藏
分享
评论
2
5
分享

创作者周榜

更多
牛客网
牛客企业服务