ABC 272 D - Root M Leaper(bfs)

https://atcoder.jp/contests/abc272/tasks/abc272_d

所以一开始就写的是对的,但是就是判定条件的位置错了,我真的会被re七四

题目大意:

给个n*n的矩阵,每次我可以跳长*长+宽*宽==m^2的地方,也就是距离我根号m的点上

跳的到的地方输出最小步数,跳不到的地方输出-1。
Sample Input 1  
3 1
Sample Output 1  
0 1 2
1 2 3
2 3 4

Sample Input 2 
10 5
Sample Output 2 
0 3 2 3 2 3 4 5 4 5
3 4 1 2 3 4 3 4 5 6
2 1 4 3 2 3 4 5 4 5
3 2 3 2 3 4 3 4 5 6
2 3 2 3 4 3 4 5 4 5
3 4 3 4 3 4 5 4 5 6
4 3 4 3 4 5 4 5 6 5
5 4 5 4 5 4 5 6 5 6
4 5 4 5 4 5 6 5 6 7
5 6 5 6 5 6 5 6 7 6

1≤M≤10^6,直接爆搜条件就行

#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
typedef pair<LL,LL> PII;
const LL MAXN=1e18;
const LL N=200200,M=2002;
vector<PII> v;
LL n,m,dist[M][M];
vector<LL> dx,dy;
void init()
{
    map<PII,LL> mp;
    for(LL i=0;i<v.size();i++)
    {
        LL x=v[i].first;
        LL y=v[i].second;
        mp[{-1*x,-1*y}]++;
        if(mp[{-1*x,-1*y}]==1)
        {
            dx.push_back(-1*x);
            dy.push_back(-1*y);
        }

        mp[{-1*x,y}]++;
        if(mp[{-1*x,y}]==1)
        {
            dx.push_back(-1*x);
            dy.push_back(y);
        }

        mp[{x,-1*y}]++;
        if(mp[{x,-1*y}]==1)
        {
            dx.push_back(x);
            dy.push_back(-1*y);
        }

        mp[{x,y}]++;
        if(mp[{x,y}]==1)
        {
            dx.push_back(x);
            dy.push_back(y);
        }
    }
}
LL bfs()
{
    memset(dist,-1,sizeof dist);
    queue<PII> q;
    q.push({1,1});
    dist[1][1]=0;
    while(q.size())
    {
        auto t=q.front();
        q.pop();
        for(LL i=0;i<dx.size();i++)
        {
            LL xx=dx[i]+t.first,yy=dy[i]+t.second;
            if(xx>=1&&xx<=n&&yy>=1&&yy<=n&&dist[xx][yy]==-1)
            {
                dist[xx][yy]=dist[t.first][t.second]+1;
                q.push({xx,yy});
            }
        }
    }
    return dist[n][n];
}
int main()
{
    cin.tie(0); cout.tie(0); ios::sync_with_stdio(false);
    LL T=1;
    //cin>>T;
    while(T--)
    {
        cin>>n>>m;
        LL flag=sqrt(m)+1;
        for(LL i=0;i<=flag;i++)
        {
            for(LL j=i;j<=flag;j++)
            {
                if(i*i+j*j==m)
                {
                    v.push_back({i,j});
                    v.push_back({j,i});
                }
                else if(i*i+j*j>m) break;
            }
        }
        //for(int i=0;i<v.size();i++)
        //cout<<v[i].first<<" "<<v[i].second<<endl;
        init();
        /*for(int i=0;i<dx.size();i++)
        {
            cout<<dx[i]<<" "<<dy[i]<<endl;
        }*/
        bfs();
        for(LL i=1;i<=n;i++)
        {
            for(LL j=1;j<=n;j++)
            {
                cout<<dist[i][j]<<" ";
            }
            cout<<endl;
        }
    }
    return 0;
}

另一种写法

#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
typedef pair<LL,LL> PII;
const LL N=2002000,M=405;
LL n,m,dist[M][M];
LL dx[N],dy[N],cnt=0;
void bfs()
{
    memset(dist,-1,sizeof dist);
    queue<PII> q;
    q.push({1,1});
    dist[1][1]=0;
    while(!q.empty())
    {
        PII t=q.front();
        q.pop();
        for(LL i=1;i<=cnt;i++)
        {
            LL xx=dx[i]+t.first,yy=dy[i]+t.second;
            if(xx>=1&&xx<=n&&yy>=1&&yy<=n&&dist[xx][yy]==-1)
            {
                dist[xx][yy]=dist[t.first][t.second]+1;
                q.push({xx,yy});
            }
        }
    }
}
int main()
{
    //cin.tie(0); cout.tie(0); ios::sync_with_stdio(false);
    LL T=1;
    //cin>>T;
    while(T--)
    {
        scanf("%ld %ld",&n,&m); //cin>>n>>m;
        for(LL i=0;i<=n;i++)
        {
            for(LL j=i;j<=n;j++)
            {
                if(i*i+j*j==m)
                {
                    dx[++cnt]=i,dy[cnt]=j;
		    dx[++cnt]=i,dy[cnt]=-j;
		    dx[++cnt]=-i,dy[cnt]=j;
		    dx[++cnt]=-i,dy[cnt]=-j;
		    dx[++cnt]=j,dy[cnt]=i;
		    dx[++cnt]=j,dy[cnt]=-i;
		    dx[++cnt]=-j,dy[cnt]=i;
		    dx[++cnt]=-j,dy[cnt]=-i;
                }
            }
        }
        bfs();
        for(LL i=1;i<=n;i++)
        {
            for(LL j=1;j<=n;j++)
            {
                printf("%ld ",dist[i][j]);
                //cout<<dist[i][j]<<" ";
            }
            printf("\n"); //cout<<endl;
        }
    }
    return 0;
}
posted @ 2022-10-09 15:24  Vijurria  阅读(104)  评论(0编辑  收藏  举报