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.自测数据(边界值或特殊值)(搜索一般测试样例就行了)


完结撒花!!

posted @ 2022-01-08 13:15  睡不醒的凪  阅读(18)  评论(0)    收藏  举报