CF35C. Fire Again 题解 bfs求最短路

题目链接:https://codeforces.com/problemset/problem/35/C

视频讲解:https://www.bilibili.com/video/BV1tZ1FYPELp/?p=4

以每个着火的点为起点求最短路,然后输出任意一个距离值最大的点即可。

需要注意的是:本题是文件输入输出。

示例程序:

#include <bits/stdc++.h>
using namespace std;
const int maxn = 2020;

int n, m, k, dis[maxn][maxn], ans; // ans 表示 dis[x][y] 最大值 

struct Node {
	int x, y;
};

int dir[4][2] = { -1, 0, 1, 0, 0, -1, 0, 1 };

bool in_map(int x, int y) {
	return x >= 1 && x <= n && y >= 1 && y <= m;
}

int main() {
	freopen("input.txt", "r", stdin);
	freopen("output.txt", "w", stdout);
	
	cin >> n >> m >> k;
	memset(dis, -1, sizeof dis);
	queue<Node> que;
	while (k--) {
		int x, y;
		cin >> x >> y;
		dis[x][y] = 0;
		que.push({x, y});
	}
	while (!que.empty()) {
		Node u = que.front();
		que.pop();
		for (int i = 0; i < 4; i++) {
			int x = u.x + dir[i][0],
				y = u.y + dir[i][1];
			if (in_map(x, y) && dis[x][y] == -1) {
				dis[x][y] = dis[u.x][u.y] + 1;
				que.push({x, y});
				ans = max(ans, dis[x][y]);
			}
		}
	}
	for (int i = 1; i <= n; i++) {
		for (int j = 1; j <= m; j++) {
			if (dis[i][j] == ans) {
				cout << i << " " << j << endl;
				return 0;
			}
		}
	}
	return 0;
}
posted @ 2024-10-24 17:51  quanjun  阅读(3)  评论(0编辑  收藏  举报