AtCoder Beginner Contest 272 D Root M Leaper
Root M Leaper
\(bfs\) 模拟
先把能走的矩阵预处理出来,然后直接跑 \(bfs\)
要注意各种边界
#include <iostream>
#include <cstdio>
#include <array>
#include <queue>
using namespace std;
#define pii pair<int, int>
const int maxn = 410;
int dis[maxn * maxn];
int vis[maxn][maxn];
vector<pii>gra;
const int xi[4] = {-1, -1, 1, 1};
const int yi[4] = {1, -1, -1, 1};
int n, m;
bool check(int x, int y)
{
return x >= 0 && x < n && y >= 0 && y < n && vis[x][y] == -1;
}
void bfs()
{
queue<array<int, 3>>q;
q.push({0, 0, 0});
for(int i=0; i<n; i++)
for(int j=0; j<n; j++)
vis[i][j] = -1;
while(q.size())
{
auto [x, y, id] = q.front();
q.pop();
vis[x][y] = id;
for(auto [xa, xb] : gra)
{
for(int k=0; k<4; k++)
{
int xx = x + xa * xi[k];
int yy = y + xb * yi[k];
if(check(xx, yy))
{
vis[xx][yy] = id + 1;
q.push({xx, yy, id + 1});
}
}
}
}
}
int main()
{
cin >> n >> m;
for(int i=0; i<=n*n; i++) dis[i] = -1;
for(int i=0; i<=n; i++) dis[i * i] = i;
for(int i=0; i<=n; i++)
{
if(m - i * i < 0 || m - i * i > n * n || dis[m - i * i] == -1) continue;
gra.push_back({i, dis[m - i * i]});
gra.push_back({dis[m - i * i], i});
}
bfs();
for(int i=0; i<n; i++)
{
for(int j=0; j<n; j++)
{
if(j) cout << " ";
cout << vis[i][j];
}
cout << "\n";
}
return 0;
}