答案是dfs会出界的0
的个数,那么我们直接从越界区域dfs回去,标记所有能达到的点。再统计有多少被标记的0
,即为答案。
#include <bits/stdc++.h> using namespace std; const int N = 1e3 + 10; char ch[N][N]; bool vis[N][N]; int n, m; inline void dfs(int x, int y) { if (x < 0 || x > n + 1 || y < 0 || y > m + 1 || ch[x][y] == '1' || vis[x][y]) return ; vis[x][y] = true; dfs(x + 1, y), dfs(x - 1, y), dfs(x, y + 1), dfs(x, y - 1); } int main() { scanf("%d%d", &n, &m); for (int i = 1; i <= n; i++) scanf("%s", &ch[i][1]); dfs(0, 0); int ans = 0; for (int i = 1; i <= n; i++) { for (int j = 1; j <= m; j++) { if (ch[i][j] == '0' && vis[i][j]) ans ++; } } printf("%d", ans); return 0; }