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;
	}
}
posted @ 2023-02-10 17:18  Liang2003  阅读(17)  评论(0编辑  收藏  举报