oibh 总部突然被水淹没了!现在需要你的救援……
oibh 被突来的洪水淹没了,还好 oibh 总部有在某些重要的地方起一些围墙。用 `*` 号表示,而一个四面被围墙围住的区域洪水是进不去的。
oibh 总部内部也有许多重要区域,每个重要区域在图中用一个 `0` 表示。
现在给出 oibh 的围墙建设图,问有多少个没被洪水淹到的重要区域。
第一行为两个正整数 $x,y$。
接下来 $x$ 行,每行 $y$ 个整数,由 `*` 和 `0` 组成,表示 oibh 总部的建设图。
输出没被水淹没的 oibh 总部的 `0` 的数量。
4 5
00000
00*00
0*0*0
00*00
1
5 5
*****
*0*0*
**0**
*0*0*
*****
5
对于 $100\%$ 的数据,$1 \le x,y \le 500$。
- #include
- #define endl '\n'
- #define int long long
- #define Bug cout<<"---------------------"<
- 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;
- }