纯数学题,找规律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; }