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; }