P1162. 填涂颜色

考点

  • DFS

题解

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
#include <bits/stdc++.h>
using namespace std;
const int LEN = 35;
int N;
//四向不是八向,不然会插进圈内
int arr[LEN][LEN], vis[LEN][LEN], walk[4][2] = {{0, 1}, {0, -1}, {-1, 0}, {1, 0}};

//秉持正难则反的原则,直接改变圈内的不方便
//那就改变圈外,输出的时候判断一下就好
//外面应该多一圈,不然无法围绕1进行搜索
void dfs(int x, int y)
{
if (x < 0 || x > N || y < 0 || y > N || arr[x][y] == -1 || arr[x][y] == 1)
return;
arr[x][y] = -1;
for (int i = 0; i < 4; ++i)
dfs(x + walk[i][0], y + walk[i][1]);
}

int main()
{
cin >> N;
for (int i = 1; i <= N; ++i)
{
for (int j = 1; j <= N; ++j)
{
cin >> arr[i][j];
}
}
//外面多一圈
++N;
dfs(0, 0);
for (int i = 1; i <= N - 1; ++i, cout << endl)
{
for (int j = 1; j <= N - 1; ++j)
{
if (arr[i][j] == -1)
cout << "0 ";
else if (!arr[i][j])
cout << "2 ";
else
cout << "1 ";
}
}
return 0;
}

思路

秉持正难则反的原则,直接改变圈内的不方便;那就改变圈外,输出的时候判断一下就好

用dfs把1外围的所有0都改成-1,这样输出的时候:

  • 等于-1的位置输出0
  • 等于1的位置输出1
  • 等于0的位置输出2

要注意,外面应该多一圈,不然无法围绕1进行搜索