分析
直接DFS。
代码
#define maxn 12
int n, m, a[maxn][maxn], b[maxn][maxn], ans, ansx, v[maxn][maxn];
int dir[4][2] = {-1, 0, 1, 0, 0, -1, 0, 1};
void dfs(int x, int y, int s, int t) {
if (x == n - 1 && y == m - 1) {
if (s < ans) {
ans = s;
ansx = t;
} else if (s == ans) {
ansx = min(ansx, t);
}
}
if (s > ans || s == ans && t >= ansx) {
return;
}
for (int i = 0; i < 4; i++) {
int ex = x + dir[i][0], ey = y + dir[i][1];
if (ex >= 0 && ex < n && ey >= 0 && ey < m && !v[ex][ey]) {
v[ex][ey] = 1;
dfs(ex, ey, s + a[ex][ey], t + b[ex][ey]);
v[ex][ey] = 0;
}
}
}
int main()
{
int t;
scanf("%d", &t);
while (t--) {
scanf("%d%d", &n, &m);
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
scanf("%d", &a[i][j]);
}
}
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
scanf("%d", &b[i][j]);
}
}
ans = ansx = inf;
memset(v, 0, sizeof v);
v[0][0] = 1;
dfs(0, 0, a[0][0], b[0][0]);
printf("%d %d\n", ans, ansx);
}
}