十二周——杭电——1002Delta-Wave

问题及代码:

Problem Description

A triangle field is numbered with successive integers in the way shown on the picture below.

十二周——杭电——1002Delta-Wave_第1张图片

The traveller needs to go from the cell with number M to the cell with number N. The traveller is able to enter the cell through cell edges only, he can not travel from cell to cell through vertices. The number of edges the traveller passes makes the length of the traveller's route.

Write the program to determine the length of the shortest route connecting cells with numbers N and M.

Input

Input contains two integer numbers M and N in the range from 1 to 1000000000 separated with space(s).

Output

Output should contain the length of the shortest route.

Sample Input

6 12 

Sample Output

3

十二周——杭电——1002Delta-Wave_第2张图片

个人分析:

在用三向坐标表示每一个格子的坐标后,计算两个格子之间最近的距离就变成了计算两个格子的坐标之间的差的绝对值的和

程序代码:

#include <iostream>
#include <cmath>
using namespace std;
int main()
{
    int m,n;
    int mlevel,mleft,mright,nlevel,nleft,nright;
    while(cin>>m>>n)
    {
        mlevel=1;
        nlevel=1;
        int i;//i表示的是每横行的各自的格子的总数
        for(i=1;;i=i+2)//由于水平坐标的每行是比上一行增加2两个格子数,所以此处表示格子数目的i应该是加2的
        {
            if(m-i<=0)
            {
                mright=(i-m)/2+1;//由于在计算右坐标的时候,每两条坐标线中间夹两个格子,所以而且计数是从左开始计数,于是,先计算目标格子位于哪两条右坐标之间,然后在计算位于第几个格子
                mleft=(m+1)/2;//计算目标格子的左坐标,
                break;
            }
            mlevel++;
            m=m-i;//确定好的最后的横行后,还剩余的格子数
        }
        for(i=1;;i=i+2)
        {
            if(n-i<=0)
            {
                nright=(i-n)/2+1;
                nleft=(n+1)/2;
                break;
            }
            nlevel++;
            n=n-i;
        }
        int sum=0;
        sum=abs(mlevel-nlevel)+abs(mright-nright)+abs(mleft-nleft);//有一个格子到另一个格子最近的距离就是两个格子的三个坐标差的绝对值的和
        cout<<sum<<endl;
    }
    return 0;
}


 

运行结果:

十二周——杭电——1002Delta-Wave_第3张图片

心得体会:

刚开始一点头绪都没有用。。后面大神指点的思路。。自己纠结的跟狗似的,最终搞出了这个东西,真心被虐成狗了

你可能感兴趣的:(十二周——杭电——1002Delta-Wave)