HDU1030 DFS&&规律



有规律的dfs:

#include<stdio.h>
int a1,a2,h1,h2,sss;//较小数在第h1层的第a1的位置,较大数在h2层的第h2的位置
void dfs(int a,int h,int s)
{
	if(h==h2)
	{
		sss=a-a2>0?s+a-a2:s+a2-a;
		return ;
	}
	if(a&1)
		dfs(a+1,h+1,s+1);//底为边,直接往下搜
	else if(a2-(h2-h)>a)//底为顶点且相对靠右,往右边搜
		dfs(a+1,h,s+1);
	else//相对靠左,往左边搜
		dfs(a-1,h,s+1);
}
void find(int x,int nn)//找位置
{
	int s,a,i;
	for(s=0,a=i=1;;i++,a+=2)
	{
		s+=a;
		if(x<=s&&nn==1)
		{
			h1=i;
			a1=x-(s-a);
			break;
		}
		else if(x<=s&&nn==2)
		{
			h2=i;
			a2=x-(s-a);
			break;
		}
	}
} 
int main ()
{
	int a,b,t;
	while(~scanf("%d%d",&a,&b))
	{
		a>b?t=a,a=b,b=t:a=a;
		find(a,1);
		find(b,2);
		dfs(a1,h1,0);
		printf("%d\n",sss);
	}
	return 0;
}


你可能感兴趣的:(HDU1030 DFS&&规律)