hdu1030 Delta-wave (数学题,找规律)
纯数学题,找规律Orz
看了网上的解题报告,稍微有点懂了
首先就是找出m和n各自所在的层数,并求出俩层的差cc,这个好办
接下来求出m(比较小的那个)所在三角往下的辐射边界,简单的说,就是m所在三角往左下角和右下角的延伸后,在n所在层的边界
再来,就是判断n是在边界内还是边界外,若是边界外,则是n与边界距离+2*cc;
若在边界内,则需判断n与m所在三角形是否同为正或同为倒,若同正同倒,则直接等于2*cc,若不同,则需判断m是正还是倒,若m为正,则为2*cc-1;若m为倒,则为2*cc+1;
结合图片比较好理解http://acm.hdu.edu.cn/showproblem.php?pid=1030
看代码吧,解释的比较清楚
#include <stdio.h>
#include<math.h>
int main()
{
int temp,n,m,s,flag=3,cn,cm,zb,yb,cc,k,sj;
while(scanf("%d%d",&m,&n)==2 )
{ flag=3;s=0;k=0;
if(m>n) { temp=m;m=n; n=temp;}
cn=(int)ceil(sqrt((double)n));//判断n和m所在层数
cm=(int)ceil(sqrt((double)m));
cc=abs(cn-cm);//判断两点层差
zb=m+(cn-1)*(cn-1)-(cm-1)*(cm-1);//判断m辐射到n层所及范围的左边界和右边界
yb=zb+2*cc;
if(n>=zb && n <=yb) //判断n在m范围所须步数
{s=2*(cc);k=1;}
else
{ if(n<zb) //判断n到m边界及m点所须步数和
s=2*(cc)+abs(n-zb);
else
s=2*(cc)+abs(n-yb);
}
sj=m-(cm-1)*(cm-1);//判断三角类型0正,1倒
if(abs(n-m)% 2 !=(cc) % 2)//不 同时为正三角或倒三角时,判断m所在为正三角还是倒三角
{
if(sj % 2 ==1 )//正三角
flag=1;
else
flag=0;
}
if(flag==1 && k==1) s=s-1;//假如n点在m点辐射范围内,正三角-1,倒三角+1,不在不判断.
if(flag==0 && k==1) s=s+1;
printf("%d\n",s);
}
return 0;
}

浙公网安备 33010602011771号