10分求调(玄关)

P1238 走迷宫

@[zhou125](/user/1041365) # mistake1 dfs中‘继续搜索’处参数传入错误 应改为 ```cpp dfs(dx, x2, dy, y2, m, n); //继续搜索 ``` # mistake2 用mp记录是否有障碍,用a记录是否走过 原代码中概念混乱 读入时是mp: ```cpp for (int i = 1; i <= m; i++) { for (int j = 1; j <= n; j++) { cin >> mp[i][j]; } } ``` 判断是否能走时应改为: ```cpp if (mp[dx][dy] == 1 /*没有障碍*/ && dx <= m && dy <= n && dx >= 1 && dy >= 1 /*没有越界*/ && a[dx][dy] != 1 /*没有经过*/) ``` 并且有一段不需要的循环: ```cpp for(int i = 1; i <= m; i++) { for(int j = 1; j <= n; j++) { if(a[i][j] == 0) { mp[i][j] = 1; } } } ``` # AC code ```cpp #include <iostream> #include <vector> using namespace std; int n, m; int sx, sy, ex, ey, ans; int a[15 + 5][15 + 5], mp[15 + 5][15 + 5]; int x_[5] = {0, -1, 0, 1}; int y_[5] = {-1, 0, 1, 0}; struct node { int x, y; }; vector<node> res; void print() { for (int i = 0; i < res.size() - 1; i++) { cout << "(" << res[i].x << "," << res[i].y << ")" << "->"; } cout << "(" << res.back().x << "," << res.back().y << ")" << endl; //最后没有“->”,单独输出 } void dfs(int x1, int x2, int y1, int y2, int m, int n) { if (x1 == x2 && y1 == y2) //到终点了 { ans++; print(); return; } for (int i = 0; i < 4; i++) { int dx = x1 + x_[i]; int dy = y1 + y_[i]; if (mp[dx][dy] == 1 /*没有障碍*/ && dx <= m && dy <= n && dx >= 1 && dy >= 1 /*没有越界*/ && a[dx][dy] != 1 /*没有经过*/) { a[dx][dy] = 1; //标记为经过 res.push_back({dx, dy}); //把当前的x和y存入res dfs(dx, x2, dy, y2, m, n); //继续搜索 a[dx][dy] = 0; res.pop_back(); } } } signed main() { ios_base::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr); // 关闭同步流 cin >> m >> n; for (int i = 1; i <= m; i++) { for (int j = 1; j <= n; j++) { cin >> mp[i][j]; } } cin >> sx >> sy; cin >> ex >> ey; res.push_back({sx, sy}); //最开始已经来过了(标记起点) a[sx][sy] = 1; dfs(sx, ex, sy, ey, m, n); if (ans == 0) cout << "-1" << endl; return 0; } ```
by ZYLZPP @ 2024-04-27 21:04:15


|