题解 | 挡住洪水
挡住洪水
https://www.nowcoder.com/practice/56e54f4c2e3c4a58abfe76dbc1da1d7e
#include<bits/stdc++.h>
using namespace std;
#define int long long
signed main(){
int x, y;
cin >> x >> y;
char c[x+2][y+2];
for(int i = 0; i < y+1; i++)
c[0][i] = '-', c[x+1][i] = '-';
for(int i = 0; i < x + 1; i++)
c[i][0] = '-', c[i][y+1] = '-';
for(int i = 1; i <= x; i++){
for(int j = 1; j <= y; j++){
cin >> c[i][j];
}
}
for(int i = 1; i <= x; i++){
for(int j = 1; j <= y; j++){
int a = i, b = j;
bool f = false;
if(c[a][b] == '0'){
c[a-1][b] == '-'?f = true:f = f;
c[a][b+1] == '-'?f = true:f = f;
c[a+1][b] == '-'?f = true:f = f;
c[a][b-1] == '-'?f = true:f = f;
}
if(f) c[a][b] = '-';
f = false;
a = x + 1 - i, b = j;
if(c[a][b] == '0'){
c[a-1][b] == '-'?f = true:f = f;
c[a][b+1] == '-'?f = true:f = f;
c[a+1][b] == '-'?f = true:f = f;
c[a][b-1] == '-'?f = true:f = f;
}
if(f) c[a][b] = '-';
f = false;
a = i, b = y + 1 - j;
if(c[a][b] == '0'){
c[a-1][b] == '-'?f = true:f = f;
c[a][b+1] == '-'?f = true:f = f;
c[a+1][b] == '-'?f = true:f = f;
c[a][b-1] == '-'?f = true:f = f;
}
if(f) c[a][b] = '-';
f = false;
a = x + 1 - i, b = y + 1 - j;
if(c[a][b] == '0'){
c[a-1][b] == '-'?f = true:f = f;
c[a][b+1] == '-'?f = true:f = f;
c[a+1][b] == '-'?f = true:f = f;
c[a][b-1] == '-'?f = true:f = f;
}
if(f) c[a][b] = '-';
}
}
int ans = 0;
for(int i = 1; i <= x; i++){
for(int j = 1; j <= y; j++){
int f = 0;
int a = i, b = j;
if(c[a][b] == '0'){
ans++;
}
}
// cout << endl;
}
cout << ans;
}
先标记上下左右边界为'-',然后再做四次遍历
第一次:从左到右,从上到下。
第二次:从左到右,从下到上。
第三次:从右到左,从上到下。
第四次:从右到左,从下到上。
如果当前元素值为'0',那就比较上下左右是否与外界连通(即上下左右是否为'-'),如果存在至少一个为'-',就标记该元素值为'-',
然后四次遍历足够将所有与外界连通的'0',变为'-'。
这四次遍历可以用一次双循环就行。
然后再计算剩下的'0'的数量就行。

查看20道真题和解析
