在输入过程中建边。每次搜索之前输入过的点有没有高度大于 0 的,如果有,那么就建立双向边。这种方法可以减少循环次数而且保证边的建立是正确的。
然后,普通的建立到终点的边。
第二次输入的时候,建立起点到蜥蜴的边。
看起来不错,运起来出错。求助。
for (register int i = 1; i <= r; ++i) {
for (register int j = 1; j <= c; ++j) {
no[i][j] = ++num;
char now;
cin >> now;
if (now < '1') continue;
h[i][j] = now - '0';
add(num, num + r * c, h[i][j]);
for (register int ii = i - d; ii <= i - 1; ++ii) {
for (register int jj = j - d; jj <= j + d; ++jj) {
if (ii < 1 || jj < 1 || jj > c) continue;
if (!h[ii][jj]) continue;
add(num + r * c, no[ii][jj], inf);
add(no[ii][jj] + r * c, num, inf);
}
}
for (register int jj = 1; jj < j; ++jj) {
if (h[i][jj]) {
add(num + r * c, no[i][jj], inf);
add(no[i][jj] + r * c, num, inf);
}
}
if (i - d < 1 || i + d > r || j - d < 1 || j + d > c) {
add(num + r * c, t, inf);
}
}
}
/悲