简单的搜索——广度优先搜索(BFS)(2)
题目来源:洛谷 P1443 马的遍历
共十个测试点
题解
AC代码:
#include <bits/stdc++.h>
using namespace std;
const int maxn = 405;
int n, m;
// 起点坐标
int si, sj;
// 地图数组
int a[maxn][maxn];
// 方向数组
int dx[10] = {0, 1, 2, 2, 1, -1, -2, -2, -1, 0}, dy[10] = {0, 2, 1, -1, -2, -2, -1, 1, 2, 0};
// 标记数组
int vis[maxn][maxn];
// 存点
struct Point
{
int x, y;
int step;
};
// 初始化地图数组和标记数组
void init()
{
for (int i = 1; i <= n; ++i)
for (int j = 1; j <= m; ++j)
{
a[i][j] = -1;
vis[i][j] = 2;
}
a[si][sj] = 0;
}
// 广度优先搜索
queue<Point> q;
void bfs()
{
// 起点入队
Point start = {si, sj, 0};
q.push(start);
vis[si][sj] = 1;
// 队列 bfs
while (!q.empty())
{
// 入点
int i = q.front().x, j = q.front().y;
// 八个方向
for (int k = 1; k <= 8; ++k)
{
// 出点
int tx = i + dx[k], ty = j + dy[k];
// vis[x][y]==2 时表示该点尚未到达
if (vis[tx][ty] == 2)
{
Point temp = {tx, ty, q.front().step + 1};
// 更改地图
a[tx][ty] = temp.step;
// 新的点入队
q.push(temp);
vis[tx][ty] = 1;
}
}
// 出队
q.pop();
}
}
// 输出代码
void out()
{
for (int i = 1; i <= n; ++i)
{
for (int j = 1; j <= m; ++j)
{
// - 左对齐
// 5 列宽为五
printf("%-5d", a[i][j]);
}
printf("\n");
}
}
int main()
{
scanf("%d%d%d%d", &n, &m, &si, &sj);
init();
bfs();
out();
return 0;
}