20pts求调
用dfs样例过了,提交wa了一片
#include <iostream>
using namespace std;
int dx[8] = {-1, -1, -1, 0, 0, 1, 1, 1};
int dy[8] = {-1, 0, 1, -1, 1, -1, 0, 1};
int g[1010][1010], bv3, lt, n, m;
bool vis[1010][1010];
inline int read()
{
int x = 0, f = 1;
char ch = getchar();
while (ch < '0' || ch > '9')
{
if (ch == '-') f = -1;
ch = getchar();
}
while (ch >= '0' && ch <= '9')
{
x = x * 10 + ch - '0';
ch = getchar();
}
return x * f;
}
void dfs(int x, int y)
{
for (int i = 0; i < 8; i ++)
{
int nx = x + dx[i], ny = y + dy[i];
if (nx >= 0 && nx <= n && ny >= 0 && ny <= m && g[nx][ny] == 0 && !vis[nx][ny])
{
vis[nx][ny] = true;
dfs(nx, ny);
}
}
}
void b(int a, int b)
{
for (int i = 0; i < 8; i ++)
{
int tx = a + dx[i];
int ty = b + dy[i];
if (tx >= 0 && tx <= n && ty >= 0 && ty <= m && g[tx][ty] != -1) g[tx][ty] ++;
}
}
int iff(int c, int d)
{
for (int i = 0; i < 8; i ++)
{
int mx = c + dx[i];
int my = d + dy[i];
if (mx >= 0 && mx <= n && my >= 0 && my <= m && g[mx][my] == 0) return 0;
}
return 1;
}
int main()
{
n = read(), m = read();
for (int i = 0; i < n; i ++)
{
for (int j = 0; j < m; j ++)
{
g[i][j] = read();
if (g[i][j] == 1) g[i][j] = -1;
}
}
for (int i = 0; i < n; i ++)
{
for (int j = 0; j < m; j ++)
{
if (g[i][j] == -1) b(i, j);
}
}
for (int i = 0; i < n; i ++)
{
for (int j = 0; j < m; j ++)
{
if (g[i][j] != 0 && g[i][j] != -1 && iff(i, j)) bv3 ++;
}
}
for (int i = 0; i < n; i ++)
{
for (int j = 0; j < m; j ++)
{
if (g[i][j] == 0 && !vis[i][j]) {
lt ++;
dfs(i, j);
}
}
}
bv3 += lt;
cout << bv3;
return 0;
}