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 @   Liang2003  阅读(22)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)
点击右上角即可分享
微信分享提示