2021-08-27
(22号学长分享的一道题,今天才来记录。)

imgimg

我自己的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
 1 #include <bits/stdc++.h>
2 using namespace std;
3 int matrix[30][30];
4 void dfs(int i, int j) {
5 if (matrix[i][j] == 1 || matrix[i][j] == 2) // 是墙,或者走过了,就走人
6 return;
7 if (matrix[i][j] == 0) // 没走过就标记为2
8 matrix[i][j] = 2;
9
10 // 上下左右继续
11 dfs(i, j+1);
12 dfs(i+1, j);
13 dfs(i, j-1);
14 dfs(i-1, j);
15 return;
16 }
17
18 int main() {
19 int n;
20 while (cin >> n) {
21 // 输入,初始化
22 for (int i = 0; i < n; i++)
23 for (int j = 0; j < n; j++)
24 cin >> matrix[i][j];
25
26 for (int i = 0; i < n; i++)
27 for (int j = 0; j < n; j++)
28 if (matrix[i][j] == 1) { // 从左到右,从上到下找到第一个1,然后从它”往右一格往下一格“那一个开始dfs
29 dfs(i+1, j+1);
30
31 // 输出
32 for (int i = 0; i < n; i++) {
33 for (int j = 0; j < n; j++)
34 cout << matrix[i][j] << " ";
35 cout << endl;
36 }
37 return 0;
38 }
39 }
40 }

问题在于:第一个2不一定在第一个1的右下也可以在第一个1的正下边(同学提醒我的)。
然后我也尝试了枚举,但是用的方法很蠢很粗暴。总之这道题很简单,解法也多,但是有不少细节需要注意。比如还有一个坑:
img
我的一次尝试是枚举每一个点,判断从这个点往上下左右方向看都有墙(1)就说明它在墙内(2)。结果三角符号标注的这两个点就被错误地标记为2了。