来源:https://www.luogu.org/problem/P1506
大意:主要是说总部被淹了,让你求出淹不到的地方总数(围起来的地方里面淹不到)
思路:从外面往里面搜,搜得到的也就是淹得到染成紫色,剩下的就是淹不到的了。
注意地方:有一个地方就是main函数里面遍历行和列进行dfs的时候,要分开行和列,把二维降到一维,要不然会超时
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
#define ll long long
int n, m, cnt = 0;
char a[522][522];
int dx[4] = { 1,0,-1,0 };//上下左右四个方向
int dy[4] = { 0,1,0,-1};
int flag = 0;
void dfs(int x, int y) {
a[x][y]='1';
for (int i = 0; i <= 3; i++) {
int row = x + dx[i];
int col = y + dy[i];
if(row>=1&&row<=n&&col>=1&&col<=m&&a[row][col]=='0')dfs(row,col);
}
}
int main()
{
cin >> n >> m;
//memset(color,0,sizeof(color));
for(int i=1;i<=n;i++)
for (int j = 1; j <= m; j++) {
cin>>a[i][j];
}
for(int i=1;i<=n;i++){//遍历第一列和第m列 ,行和列分开写,要不然会超时
if(a[i][1]=='0')dfs(i,1);
if(a[i][m]=='0')dfs(i,m);
}
for(int j=1;j<=m;j++){
if(a[1][j]=='0')dfs(1,j);
if(a[n][j]=='0')dfs(n,j);
}
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
if(a[i][j]=='0')cnt++;
}
}
cout<<cnt;
return 0;
}