
#include<iostream>
using namespace std;
const int MAXN = 500 + 10;
int n, m, ans;
int map[MAXN][MAXN];
int dx[] = {0, 1, -1, 0, 0};
int dy[] = {0, 0, 0, -1, 1};
void search(int x, int y)
{
map[x][y] = 1; //被淹没了 ,标为 1
for(int i = 1; i <= 4; i++) //往四个方向搜
{
int nx = x + dx[i];
int ny = x + dy[i];
if(map[nx][ny] == 0 && nx > 0 && nx <= n && ny > 0 && ny <= m)
{
search(nx, ny);
}
}
}
int main()
{
char e;
cin >> n >> m;
for(int i = 1; i <= n; i++) //输入
{
for(int j = 1; j <= m; j++)
{
cin >> e;
if(e == '*') //如果是墙,标为 1
{
map[i][j] = 1;
}
else
{
map[i][j] = 0; //其他标为 0
}
}
}
for(int i = 1; i <= n; i++) //因为谁是从外部淹没,所以从最外层开始搜索
{
if(map[i][1] == 0) //搜索第一列
{
search(i, 1);
}
if(map[i][m] == 0) //搜索最后一列
{
search(i, m);
}
}
for(int i = 1; i <= m; i++)
{
if(map[1][i] == 0) //搜索第一行
{
search(1, i);
}
if(map[n][i] == 0) //搜索最后一行
{
search(n, i);
}
}
for(int i = 1; i <= n; i++) //因为被淹没的都与最外层的 0 相连
{ //所以没有被淹没的都被墙堵住了
for(int j = 1; j <= m; j++) //搜索剩余的 0
{
if(map[i][j] == 0)
{
ans++;
}
}
}
/* for(int i = 1; i <= n; i++) //测试哪些被淹没
{
for(int j = 1; j <= m; j++)
{
cout << map[i][j];
}
cout << endl;
}
*/
cout << ans << endl;
return 0;
}
不知道哪里错了,在测试的过程中,样例一 一直过不了,救救我
