拯救oibh总部 - 洛谷
## 题目背景
oibh 总部突然被水淹没了!现在需要你的救援……
## 题目描述
oibh 被突来的洪水淹没了,还好 oibh 总部有在某些重要的地方起一些围墙。用 `*` 号表示,而一个四面被围墙围住的区域洪水是进不去的。
oibh 总部内部也有许多重要区域,每个重要区域在图中用一个 `0` 表示。
现在给出 oibh 的围墙建设图,问有多少个没被洪水淹到的重要区域。
## 输入格式
第一行为两个正整数 $x,y$。
接下来 $x$ 行,每行 $y$ 个整数,由 `*` 和 `0` 组成,表示 oibh 总部的建设图。
## 输出格式
输出没被水淹没的 oibh 总部的 `0` 的数量。
## 样例 #1
### 样例输入 #1
4 5
00000
00*00
0*0*0
00*00
### 样例输出 #1
1
## 样例 #2
### 样例输入 #2
5 5
*****
*0*0*
**0**
*0*0*
*****
### 样例输出 #2
5
## 提示
对于 $100\%$ 的数据,$1 \le x,y \le 500$。
分析:依次从外层向内搜索,只有全面围住的才算一个结果
#include <bits/stdc++.h>
#define endl '\n'
#define int long long
#define Bug cout<<"---------------------"<<endl
using namespace std;
constexpr int N = 550;
int n, m;
char mp[N][N];
bool in(int x, int y) {
return x >= 0 && x < n&& y >= 0 && y < m;
}
int dx[4] = {-1,0,0,1};
int dy[4] = { 0,-1,1,0 };
void dfs(int x, int y) {
mp[x][y] = '*';
for (int i = 0;i < 4;i++) {
int tx = x + dx[i];
int ty = y + dy[i];
if (in(tx, ty) && mp[tx][ty] == '0') {
dfs(tx, ty);
}
}
}
signed main() {
ios_base::sync_with_stdio(0);
cin.tie(0); cout.tie(0);
cin >> n >> m;
for (int i = 0;i < n;i++) {
for (int j = 0;j < m;j++) {
cin >> mp[i][j];
if (mp[i][j] == 0) {
mp[i][j] = '0';
}
}
}
//搜索第一行和最后一行;
for (int i = 0;i < m;i++) {
if (mp[0][i]=='0') {
dfs(0, i);
}
if (mp[n - 1][i] == '0') {
dfs(n - 1, i);
}
}
//搜索第一列,最后一列
for (int i = 0;i < n;i++) {
if (mp[i][0]=='0') {
dfs(i, 0);
}
if (mp[i][m - 1] == '0') {
dfs(i, m - 1);
}
}
int ans = 0;
for (int i = 0;i < n;i++) {
for (int j = 0;j < m;j++) {
if (mp[i][j]=='0') {
ans++;
}
}
}
cout << ans << endl;
return 0;
}