Luogu P1162 填涂颜色题解
【问题分析】
- 分析题目可得此问题为连通块问题
- 因此题枚举被包围的‘0’较难
- 所以可用枚举每一个不被包围的‘0’
【设计程序】
1 #include<bits/stdc++.h> 2 #include<iostream> 3 #include<stdio.h> 4 #include<cstdio> 5 #include<queue> 6 using namespace std; 7 const int N = 30 + 5; 8 int n, d[N][N]; 9 bool vis[N][N]; 10 int dt[4][2] = {{-1, 0}, {0, 1}, {1, 0}, {0, -1}}; 11 //四种扩展方法 12 13 void dfs (int x, int y)//描述点的位置 14 { 15 vis[x][y] = 1;//标记为未包围 16 for (int i = 0;i < 4; i++) 17 { 18 int vx, vy; 19 vx = x + dt[i][0]; 20 vy = y + dt[i][1]; 21 if (vx < 1 || vx > n || vy < 1 || vy > n) continue; 22 //不符合的跳过 23 if (vis[vx][vy] || d[vx][vy]) continue; 24 //不符合的跳过 25 dfs (vx, vy) ; 26 } 27 } 28 int main() 29 { 30 int i, j; 31 scanf ("%d", &n); 32 for (int i = 1;i <= n; i++) 33 for (int j = 1;j <= n; j++) 34 scanf ("%d", &d[i][j]); 35 for (int i = 1;i <= n; i++) 36 //找到四个角上不被包围的‘0’并标记 37 { 38 if (!vis[1][i] && !d[1][i]) dfs(1, i); 39 if (!vis[n][i] && !d[n][i]) dfs(n, i); 40 if (!vis[i][1] && !d[i][1]) dfs(i, 1); 41 if (!vis[i][n] && !d[i][n]) dfs(i, n); 42 } 43 44 for (int i = 1;i <= n; i++) 45 { 46 for (int j = 1;j <= n; j++) 47 { 48 if (!vis[i][j] && !d[i][j]) printf ("2 "); 49 //如果没被标记且原为‘0’用2代替 50 else printf ("%d ", d[i][j]); 51 } 52 printf ("\n"); 53 } 54 return 0; 55 }
【调试代码】
1.测试样例,
2.自测数据(边界值或特殊值)(搜索一般测试样例就行了)
完结撒花!!

浙公网安备 33010602011771号