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;
}