UVA10022-Delta-wave

chunlvxiong的博客


题目描述:

  给出一个三角形(图片自己看原题吧),求出任意两个点之间的最短路。

思考&分析:

  分情况讨论:
  假设从a到b(a<b),
  首先可以快速计算出xa,ya,xb,yb表示a,b的坐标。
  对于ya为偶数的情况,它可以通过走两步到达下一层的(xa+1,ya)或(xa+1,ya+2)。
  那么首先肯定是把xa调整成xb,所以ans+=(xb-xa)*2。
  然后到达第xb层的话y值的范围就是ya~ya+(xb-xa)*2
  如果yb就在这个范围内,那么如果yb是奇数ans++,否则ans不变。
  如果yb<ya,那么ans+=ya-yb。
  如果yb>ya+(xb-xa)*2,那么ans+=ya+(xb-xa)*2-yb。
  这样就可以解决ya为偶数的情况。
  ya为奇数的情况:
  1、xa=xb,直接打出yb-ya。
  2、因为它们不再同一列,所以(xa,ya)必然下移到(xa+1,ya+1),将其作为第一步,然后因为ya+1变成了偶数,按照上述步骤处理就好了。

贴代码:

#include <bits/stdc++.h>
using namespace std;
int a,b,xa,xb,ya,yb;
int main(){
    int T; scanf("%d",&T);
    while (T--){
        scanf("%d%d",&a,&b);
        if (a>b) swap(a,b);
        xa=sqrt(a); if (xa*xa==a) xa--; ya=a-xa*xa; xa++;
        xb=sqrt(b); if (xb*xb==b) xb--; yb=b-xb*xb; xb++;
        int ans=0;
        if (ya&1)
            if (xa==xb) printf("%d\n",yb-ya);
            else
                xa++,ya++,ans++;
        if (!(ya&1)){
            ans+=(xb-xa)*2;
            int Max1=ya,Max2=ya+(xb-xa)*2;
            if (Max1<=yb && yb<=Max2)
                if (yb&1) ans++;
                else;
            else if (yb<Max1) ans+=Max1-yb;
            else ans+=yb-Max2;
            printf("%d\n",ans);
        }
        if (T) puts("");
    }
    return 0;
}

 

posted @ 2017-09-17 21:38  chunlvxiong  阅读(189)  评论(0编辑  收藏  举报