题目描述:
小华和小为是很要好的朋友,他们约定周末一起吃饭。通过手机交流,他们在地图上选择了多个聚餐地点(由于自然地形等原因,部分聚餐地点不可达),求小华和小为都能到达的聚餐地点有多少个?
输入描述:
第一行输入 m 和 n,其中:m 代表地图的长度,n 代表地图的宽度;
第二行开始具体输入地图信息,地图信息包含:
0 为通畅的道路
1 为障碍物(且仅1为障碍物)
2 为小华或者小为,地图中必定有且仅有2个 (非障碍物)
3 为被选中的聚餐地点(非障碍物)
输出描述:
可以被两方都到达的聚餐地点数量,行末无空格。
备注:
地图的长宽为 m 和 n,其中:
4 ≤ m ≤ 100
4 ≤ n ≤ 100
聚餐的地点数量为 k,则 1< k ≤ 100
示例1:
输入
4 4
2 1 0 3
0 1 2 1
0 3 0 0
0 0 0 0
输出
2
说明:
第一行输入地图的长度为3和4。
第二行开始为具体的地图,其中:
3代表小华和小明选择的聚餐地点;
2代表小华或者小明(确保有2个);
0代表可以通行的位置;
1代表不可以通行的位置。
此时,两者都能到达的聚餐位置有2处。
示例2:
输入
4 4
2 1 2 3
0 1 0 0
0 1 0 0
0 1 0 0
输出
0
说明:
第一行输入地图的长度为4和4。
第二行开始为具体的地图,其中:
3代表小华和小明选择的聚餐地点;
2代表小华或者小明(确保有2个);
0代表可以通行的位置;
1代表不可以通行的位置。
由于图中小华和小为之间有个阻隔,此时,没有两人都能到达的聚餐位置,所以输出0;
C++源码:
#include <iostream>
#include <queue>
#include <vector>
using namespace std;
const int MAXN = 105;
int m, n, cnt2 = 0, cnt3 = 0;
vector<vector<int>> grid(MAXN, vector<int>(MAXN)); // 使用vector定义地图
void BFS(int x, int y, int who) {
queue<pair<int, int>> q;
q.push({ x, y });
vector<vector<bool>> visited(m, vector<bool>(n, false)); // 初始化访问状态
visited[x][y] = true;
while (!q.empty()) {
int curX = q.front().first;
int curY = q.front().second;
q.pop();
if (grid[curX][curY] == 3) cnt3++; // 记录可到达的聚餐地点
for (int dx = -1; dx <= 1; dx++) {
for (int dy = -1; dy <= 1; dy++) {
int newX = curX + dx;
int newY = curY + dy;
if (newX >= 0 && newX < m && newY >= 0 && newY < n && grid[newX][newY] != 1 && !visited[newX][newY]) {
q.push({ newX, newY });
visited[newX][newY] = true;
}
}
}
}
}
int main() {
cin >> m >> n;
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
cin >> grid[i][j];
if (grid[i][j] == 2) cnt2++;
}
}
if (cnt2 != 2) {
cout << 0 << endl; // 确保只有两个起点(小华和小为)
return 0;
}
// 假设先找到一个起点2,进行BFS
bool startFound = false;
for (int i = 0; i < m && !startFound; i++) {
for (int j = 0; j < n; j++) {
if (grid[i][j] == 2) {
BFS(i, j, 0);
startFound = true;
break;
}
}
}
cout << cnt3 << endl; // 输出最终能到达的聚餐地点数量
system("pause");
return 0;
}