您的位置:首页 > 其它

HDU1030 DFS&&规律

2013-11-23 23:08 543 查看
有规律的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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: