@[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