hdoj 1030

来源:互联网 发布:mac水漾轻盈粉底液色号 编辑:程序博客网 时间:2024/05/17 02:34

写了一整天的程序。

分三种情况:1 终点在起点所在顶点大三角形里 2 左方 3右方。

在大三角形内则必定通过下方第一个三角形的顶点 则至终点在其边上。

 

#include <iostream>
#include <cmath>
using namespace std;
int main()
{
    int M,N,t;
    int m,n,a,b,A_L,A_R,B_L,B_R,Distan,temp;
    while (scanf("%d%d",&M,&N)!=EOF)
    {
        if(M>N)                     //M<N
        {
            t=M;M=N;N=t;
        }
        m=int(sqrt(double(M-1)))+1;          //第m,n层
        n=int(sqrt(double(N-1)))+1;
       
        if(m==n)
            Distan=N-M;
        else
        {
            a=M-(m-1)*(m-1);           //第m层第a个 第n层第b个
            b=N-(n-1)*(n-1);
            A_L=(a-1)/2+1;           //第n层第A_L个左菱形 第A_R个右菱形
            A_R=a/2+n-m;
            B_L=(b-1)/2+1;           //第n层第B_L个左菱形 第B_R个右菱形
            B_R=b/2;
           
            if(A_L>=B_L)
            {
                t=(n-1)*(n-1)+2*A_L;
                if((m%2==0 && M%2==0) || (m%2==1 && M%2==1))
                    Distan=2*(n-m)-1;
                else
                    Distan=2*(n-m);
                Distan+=(t-N);
            }
            else if(B_R>=A_R)
            {
                t=(n-1)*(n-1)+A_R*2;
                if((m%2==0 && M%2==0) || (m%2==1 && M%2==1))
                    Distan=2*(n-m)-1;
                else
                    Distan=2*(n-m);
                Distan+=(N-t);
            }
            else
            {
                if((m%2==0 && M%2==0) || (m%2==1 && M%2==1))
                {    Distan=4, a+=2; M=(m+1)*(m+1)+a, m+=2;}
                else
                {    Distan=3 ;M=m*m+a+1; m+=1 ,a+=1;}
                A_L=(a-1)/2+1;
                A_R=a/2+n-m;
                while(A_L<B_L && A_R>B_R)
                {
                    Distan+=4;
                    a+=2;
                    M=(m+1)*(m+1)+a;
                    m+=2;
                    A_L=(a-1)/2+1;
                    A_R=a/2+n-m;
                }
                if(N>M)
                {
                    Distan+=(2*(n-m)-1);
                    temp=(n-1)*(n-1)+A_L*2;
                    t=(n-1)*(n-1)+A_R*2;
                    if(N<=temp)
                        Distan+=abs(N-temp);
                    else
                        Distan+=abs(N-t);
                }
            }
        }
        printf("%d/n",Distan);
    }
    return 0;
}