0%

2026 杭电春季联赛 4——1001-布布吃地瓜

题目大意

题目描述
给定一个 n×mn \times m 的网格,每个格子 (i,j)(i, j) 中包含一个非负整数 ai,ja_{i, j}
你需要从左上角 (1,1)(1, 1) 出发,经过上下左右四连通的合法移动,最终到达右下角 (n,m)(n, m),移动过程中不能离开网格。
SS 表示路径上经过的所有格子中的整数构成的集合,mex(S)\text{mex}(S) 表示集合 SS 中未出现的最小非负整数。
求出所有从 (1,1)(1, 1)(n,m)(n, m) 的路径中,可能得到的最小的 mex(S)\text{mex}(S) 值。

输入格式
第一行包含一个整数 TT1T10001 \le T \le 1000),表示测试数据组数。
对于每组数据:
第一行包含两个整数 nnmmn2000\sum n \le 2000m2000\sum m \le 2000)。
接下来 nn 行,每行 mm 个整数,表示网格中的数字 ai,ja_{i, j}0ai,j1090 \le a_{i, j} \le 10^9)。

输出格式
对于每组测试数据,输出可能得到的最小的 mex(S)\text{mex}(S)

样例输入

1
2
3
4
5
1
3 3
0 0 0
0 0 0
0 0 0

样例输出

1
1

样例解释
在此样例中,给定了 3×33 \times 3 的网格,且所有格子内的数字均为 0。无论布布选择哪一条从 (1,1)(1, 1) 走到 (3,3)(3, 3) 的合法路径,路径上经过的数字集合 SS 必然只包含元素 0,即 S={0}S = \{0\}。在集合 {0}\{0\} 中,未出现的最小非负整数是 1,因此可能得到的最小的 mex(S)\text{mex}(S) 为 1。

思路讲解

PDF

image

找出所有的这个值为 k 的屏障。

这个代码就是看哪些值是避无可避的。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
for (int y = 1; y <= M; ++y) {
if (vis[1][y]) {
continue;
}
vis[1][y] = 1;
if (dfs(1, y,1,y)) {
st.erase(maze[1][y]);
}
}
for (int x = 1; x <= N; ++x) {
if (vis[x][M]) {
continue;
}
vis[x][M] = 1;
if (dfs(x, M,x,M)) {
st.erase(maze[x][M]);
}
}

AC代码

心路历程(WA,TLE,MLE……)