第5个点TLE

P1162 填涂颜色

稍微解释下,思路是第一个'1'左下方必定是0,以这个0开始对封闭区域内的0进行染色,但是第5个点TLE过不去
by Misaki_Wang @ 2022-07-06 21:10:32


@[WBYZ](/user/602811) `第一个'1'左下方必定是0`这句话不是对的,比如, 000 010 101 010 换一种思路吧
by openallzzz @ 2022-07-14 17:39:47


有一种思路比较好理解,是这样的,对于矩形的边界上的0,一定不属于1包围的圈,因为这些点至少会有一个方向不存在1(至少是因为边界上的点的四周至少有一个方向的点是不合法的,不合法的点固然不存在1) ## 代码 ``` #include <iostream> #include <cstring> #include <algorithm> using namespace std; const int N = 35; int n; int g[N][N]; int dx[4] = {-1, 0, 1, 0}, dy[4] = {0, 1, 0, -1}; void dfs(int x, int y, int c) { g[x][y] = c; for(int i = 0; i < 4; i ++) { int a = x + dx[i], b = y + dy[i], t = (c == 2 ? 0 : 2); if(a >= 1 && a <= n && b >= 1 && b <= n && g[a][b] == t) dfs(a, b, c); } } int main() { cin >> n; for(int i = 1; i <= n; i ++) for(int j = 1; j <= n; j ++) cin >> g[i][j]; for(int i = 1; i <= n; i ++) for(int j = 1; j <= n; j ++) if(g[i][j] == 0) dfs(i, j, 2); for(int i = 1; i <= n; i ++) for(int j = 1; j <= n; j ++) if(i == 1 || i == n || j == 1 || j == n) if(g[i][j] == 2) dfs(i, j, 0); for(int i = 1; i <= n; i ++) { for(int j = 1; j <= n; j ++) printf("%d ", g[i][j]); puts(""); } return 0; } ```
by openallzzz @ 2022-07-14 17:43:28


|