Loading

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;
}
posted @ 2022-10-09 10:35  dgsvygd  阅读(69)  评论(0编辑  收藏  举报