这个问题呢是bfs的入门题,向较于dfs深搜,广搜的时间复杂度会降低一些,因为dfs是找不到一个解不回头,而bfs是找最优解,所以这就是两者的区别
如果想掌握bfs,前提是有dfs的基础和会用队列
那这道题就是bfs的模板题目了代码如下:
#include <iostream>
#include <queue>
#include <utility>
#include <cstring>
using namespace std;
int n, m, x, y;
int walk[8][2] = {{-1, 2}, {1, 2}, {-2, 1}, {2, 1}, {-1, -2}, {1, -2}, {-2, -1}, {2, -1}};
int a[410][410];
bool b[410][410];
pair<int, int> p;
queue<pair<int, int> > q;
int main() {
cin >> n >> m >> x >> y;
memset(a, -1, sizeof(a));
memset(b, false, sizeof(b));
p.first = x, p.second = y;
q.push(p);
while (!q.empty()) {
p = q.front();
q.pop();
if (b[p.first][p.second]) continue;
if (p.first == x && p.second == y) {
a[p.first][p.second] = 0;
}
b[p.first][p.second] = true;
for (int i = 0; i < 8; i++) {
int nx = p.first + walk[i][0], ny = p.second + walk[i][1];
if (nx < 1 || nx > n || ny < 1 || ny > m) continue; // 修正了边界检查,使索引从 1 开始
if (b[nx][ny]) continue;
a[nx][ny] = a[p.first][p.second] + 1;
q.push(make_pair(nx, ny));
}
}
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= m; j++) {
cout << a[i][j] << " ";
}
cout << endl;
}
return 0;
}
当队列为空时,说明所有格子都走过了,那么循环结束,起始点和边界一定要处理好,代码一定要自己去多敲几遍,上述只是模板,真正掌握还是要去多刷题
加油