hdu1030 Deltawave (数学题,找规律)

纯数学题,找规律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;
}
原文地址:https://www.cnblogs.com/nanke/p/2120409.html