题面如下:
思路:
预处理出 可以加的
(
x
,
y
)
(x,y)
(x,y) 二元组 方便操作
然后正常 BFS就行
AC代码:
const int N = 409;
int n, m, s[N][N];
vector<PII> v;
struct nn
{
int x, y, cnt;
};
int fx[4] = {1, 1, -1, -1};
int fy[4] = {1, -1, 1, -1};
void bfs()
{
queue<nn> q;
q.push({1, 1, 0});
while (q.size())
{
nn t = q.front(); q.pop();
int x = t.x, y = t.y, cnt = t.cnt;
for (auto [xx, yy] : v)
{
for (int i = 0; i < 4; i++)
{
int nx = x + xx * fx[i], ny = y + yy * fy[i];
if (nx < 1 || nx > n || ny < 1 || ny > n)
continue;
if (s[nx][ny] == -1)
s[nx][ny] = cnt + 1, q.push({nx, ny, cnt + 1});
}
}
}
}
void solve()
{
cin >> n >> m;
memset(s, -1, sizeof s);
s[1][1] = 0;
for (int i = 0; i <= 1000; i++)
for (int j = 0; j <= 1000; j++)
if (i * i + j * j == m) v.push_back({i, j});
bfs();
for (int i = 1; i <= n; i++)
for (int j = 1; j <= n; j++)
cout << s[i][j] << " \n"[j == n];
}
int main()
{
buff;
solve();
}