ABC 272 D (BFS)
ABC 272 D
题意
给定一个N*N的棋盘,棋子初始位置在(1,1),给定一个数M,棋子每步操作可以走到距离不超过M的位置,假设棋子在(i,j),则下一步(x,y)应满足(x-i)×(x-i)+ (y-j)×(y-j)<= M
思路
这是加强版的bfs,平常的bfs一般是四个方向或者八个方向,这次可以有很多个方向,用dx数组和dy数组存储(x,y)。
代码
void make(int i,int k)
{
dx[++cnt]=i;
dy[cnt]=k;
dx[++cnt]=-i;
dy[cnt]=k;
dx[++cnt]=i;
dy[cnt]=-k;
dx[++cnt]=-i;
dy[cnt]=-k;
}
void solve()
{
cin>>n>>m;
for(int i=0;i*i<=m/2;i++)
{
int k=sqrt((m-i*i)*1.0);
if(k*k!=m-i*i) continue;
//一对{i,j}有几种情况:{i,j} {-i,j} {i,-j} {-i,-j}
//反过来也有
make(i,k);
make(k,i);
}
bfs();
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
cout<<f[i][j]<<" ";
}
cout<<endl;
}
}