考察BFS、队列的知识点
直接上代码:
#include<iostream>
using namespace std;
#define PII pair<int, int>
const int N = 510;
int n, m;
int x, y;
int hh = 0, tt = 0;
int grid[N][N];
int vis[N][N];
PII queue[N * N];
int dx[9] = {0, 2, 2, 1, 1, -2, -2, -1, -1};
int dy[9] = {0, 1, -1, 2, -2, 1, -1, 2, -2 };
bool check(int x, int y,int nx, int ny)
{
if (vis[x + nx][y + ny] || x + nx < 1 || x + nx > n || y + ny < 1 || y + ny > m)
return false;
return true;
}
void bfs(int x, int y)
{
queue[tt++] = { x, y };
vis[x][y] = 1;
while (hh < tt)
{
PII p = queue[hh];
hh++;
for (int i = 1; i <= 8; i++)
{
if (check(p.first, p.second, dx[i], dy[i]))
{
queue[tt++] = { p.first + dx[i], p.second + dy[i] };
vis[p.first + dx[i]][p.second + dy[i]] = 1;
grid[p.first + dx[i]][p.second + dy[i]] = grid[p.first][p.second] + 1;
}
}
}
}
int main()
{
cin >> n >> m;
cin >> x >> y;
bfs(x, y);
for (int i = 1; i <= n; i++)
{
for (int j = 1; j <= m; j++)
{
if (i == x && j == y)
cout << 0 << " ";
else if (!grid[i][j])
cout << -1 << " ";
else
cout << grid[i][j] << " ";
}
cout << endl;
}
}