#include #include #include #include #define NMAX 505 #define pii pair #define mp make_pair #define x first #define y second #define pb push_back using namespace std; char A[NMAX][NMAX]; int n, m, B[NMAX][NMAX], D[NMAX][NMAX]; bool mark[NMAX][NMAX], good[NMAX][NMAX]; queue Q; vector fin; inline int ok(int x, int y) { return 1 <= x && x <= n && 1 <= y && y <= m; } int dx[] = {-1, 0, 0, 1}; int dy[] = {0, -1, 1, 0}; int main() { //~ freopen("input", "r", stdin); scanf("%d%d\n", &n, &m); for (int i = 1; i <= n; i++) fgets(A[i] + 1, NMAX, stdin); for (int i = 1; i <= n; i++) for (int j = 1; j <= m; j++) if (!mark[i][j] && A[i][j] == '1') { B[i][j] = 1; D[i][j] = 0; Q.push(mp(i, j)); mark[i][j] = true; while (!Q.empty()) { int x = Q.front().x; int y = Q.front().y; Q.pop(); fin.pb(mp(x, y)); for (int k = 0; k < 4; k++) { int a = x + dx[k], b = y + dy[k]; if (ok(a, b) && A[a][b] == '1' && (!mark[a][b] || (mark[a][b] && D[a][b] == D[x][y] + 1))) { mark[a][b] = true; D[a][b] = D[x][y] + 1; B[a][b] += B[x][y]; if (B[a][b] >= 2) B[a][b] = 2; } } } } for (int i = 0; i < fin.size(); i++) { int x = fin[i].x, y = fin[i].y; if (D[x][y] == 2) good[x][y] = true; for (int k = 0; k < 4; k++) { int a = x + dx[k], b = y + dy[k]; if (ok(a, b) && A[a][b] == '1' && D[a][b] == 2) good[x][y] = true; } } int res = 0; for (int i = 1; i <= n; i++) for (int j = 1; j <= m; j++) if (good[i][j]) res++; printf("%d\n", res); return 0; }