8 条题解
-
0
回溯,
注:本题需要按照😕(没错, 我就没看见这个qwq左上右下
进行移动, 不然结果会被误判?#include <cstdio> #include <vector> #include <functional> #include <utility> using namespace std; int main() { int n, m; scanf("%d %d", &n, &m); vector<vector<char>> map(n, vector<char>(m)); vector<vector<char>> ita(n, vector<char>(m)); for (int i = 0; i < n; ++i) for (int j = 0; j < m; ++j) { int tmp; scanf("%d", &tmp); map[i][j] = tmp; // 1 可以走, 0 不可以走 } int s_x, s_y, e_x, e_y; scanf("%d %d", &s_y, &s_x); scanf("%d %d", &e_y, &e_x); --s_x, --s_y, --e_x, --e_y; bool tag = 1; int fx[4][2] = { {0, -1}, {-1, 0}, {0, 1}, {1, 0} }; vector<pair<int, int>> lj; // 路径 (i, j) function<void(int, int)> dfs = [&](int i, int j) { if (i < 0 || j < 0 || i >= n || j >= m) return; if (ita[i][j] || !map[i][j]) return; // 之前走过 || 不能走 if (i == e_y && j == e_x) { // 输出 for (int i = 0; i < lj.size(); ++i) { printf("(%d,%d)->", lj[i].first + 1, lj[i].second + 1); } printf("(%d,%d)\n", e_y + 1, e_x + 1); tag = 0; return; } ita[i][j] = 1; lj.push_back({i, j}); for (auto& it : fx) { dfs(i + it[0], j + it[1]); } lj.pop_back(); ita[i][j] = 0; }; dfs(s_y, s_x); if (tag) printf("-1\n"); return 0; }
信息
- ID
- 84
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 8
- 标签
- 递交数
- 814
- 已通过
- 124
- 上传者