1 条题解
-
0
解题思路:
暴力出奇迹!数据范围不大,跟着题意直接爆搜加剪枝即可。
对于这种求最小值的爆搜,一个非常玄学且有效的剪枝就是记录每个格子当前所用的最短时间。
然后就没了。要注意把第一个点初始化好
当初dict第一个点没初始化调了我半天。CODE:
#include<iostream> using namespace std; int m, n, x, y, c, ans = 1e9, dict[101][101], num[101][101]; int xy[4][2]{{0, 1}, {0, -1}, {1, 0}, {-1, 0}}; bool vis[101][101]; void dfs(int x, int y, int now, int lst) { if (now > ans) return; if (x == m && y == m) { ans = min(ans, now); return; } for (int i = 0; i < 4; i++) { int dx = x + xy[i][0], dy = y + xy[i][1]; if (dx >= 1 && dx <= m && dy >= 1 && dy <= m && vis[dx][dy] == 0 && (num[x][y] != -1 || num[dx][dy] != -1)) { if (num[dx][dy] == -1) { if (now + 2 < dict[dx][dy]) { vis[dx][dy] = 1; dict[dx][dy] = now + 2; dfs(dx, dy, now + 2, lst); vis[dx][dy] = 0; } } else { if (num[dx][dy] == lst) { if (now < dict[dx][dy]) { vis[dx][dy] = 1; dict[dx][dy] = now; dfs(dx, dy, now, lst); vis[dx][dy] = 0; } } else { if (now + 1 < dict[dx][dy]) { vis[dx][dy] = 1; dict[dx][dy] = now + 1; dfs(dx, dy, now + 1, num[dx][dy]); vis[dx][dy] = 0; } } } } } } int main() { cin >> m >> n; for (int i = 1; i <= m; i++) { for (int j = 1; j <= m; j++) { num[i][j] = -1; dict[i][j] = 1e9; } } while (n--) { cin >> x >> y >> c; num[x][y] = c; } vis[1][1] = 1; dict[1][1] = 0; dfs(1, 1, 0, num[1][1]); if (ans == 1e9) cout << -1; else cout << ans; return 0; }
- 1
信息
- ID
- 2030
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 9
- 标签
- 递交数
- 18
- 已通过
- 3
- 上传者