L1-108-神奇的水管(20分)
题目要求:
X星球上的水路布局所使用的水管是很特殊的, 一共有6个开口, 上,下,左,右,左上,右下. 假定我们将两个开口相连的水管认为是同一个水管, 请你编程求出X星球上的水管个数. 为了方便起见, 我们将开口表示为+号, 其他表示为-号.
输入
输入为多行数据, 第一行为一个正整数N, 表示接下来要给出的水管布局的行数.
接下来给出N行字符串, 为X星球上的水管布局.
输出
输出为一个正整数, 为X星球的总水管数.
样例输入
5
--+--
-+-+-
-+--+
-----
----+
样例输出
3
提示
输入的矩阵是n*n
解题思路:
广度优先遍历(BFS)。从起点开始搜索,搜索数组中其上下左右,左上,右下的元素的值是否为 '+',是则将其对应坐标压入队列,并且改变他的值为 '-'。直到队列为空退出搜索。
以上为一次搜索,可以在数组遍历遇到一个 '+' 时清空一条水管,并计数,继续遍历,直到数组遍历完成,输出计数结果。
通关代码:
#include <iostream>
#include <vector>
#include <queue>
using namespace std;
void checkPipe(vector<vector<char>> &matrix, int originX, int originY) {
const int bx[] = {0, 0, -1, 1, -1, 1};
const int by[] = {1, -1, 0, 0, -1, 1};
int ROW = matrix.size();
int COLUMN = matrix[0].size();
matrix[originX][originY] = '-';
queue<pair<int, int>> q;
q.emplace(pair<int, int>(originX, originY));
while (!q.empty()) {
int x = q.front().first;
int y = q.front().second;
q.pop();
for (int i = 0; i < 6; i++) {
int nx = x + bx[i];
int ny = y + by[i];
if (nx >= 0 && nx < ROW && ny >= 0 && ny < COLUMN) {
if (matrix[nx][ny] == '+') {
matrix[nx][ny] = '-';
q.emplace(pair<int, int>(nx, ny));
}
}
}
}
}
int main() {
int n, sum = 0;
cin >> n;
vector<char> arr(n);
vector<vector<char>> matrix;
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
cin >> arr[j];
}
matrix.emplace_back(arr);
}
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
if (matrix[i][j] == '+') {
sum++;
checkPipe(matrix, i, j);
}
}
}
cout << sum;
return 0;
}
通关截图: