题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1030
题目大意:在这个数字塔中,求M到N的最少步数。
关键思想:看规模,搜索一定不行。抽象线性的距离计算。竖直方向,左下方向,右下方向的向量是独立的。
代码如下:
//数学,线性距离计算。抽象思维
#include <iostream>
#include <cmath>
using namespace std;
long long N,M;
int main() {
//n1,n2分别为N,M的层数。_x1,_x2分别为从左往右数N和M在当前层的序数,X1_,x2_分别为从右往左数的序数
long long n1,n2,_x1,_x2,x1_,x2_;
long long dn,_dx,dx_;//d表示差值
while(cin>>N>>M){
n1=ceil(sqrt(N)),n2=ceil(sqrt(M));//当前层数为开根号向上取整
_x1=N-(n1-1)*(n1-1),_x2=M-(n2-1)*(n2-1);//前n-1层共有(n-1)^2个数。等差求和
x1_=2*n1-_x1,x2_=2*n2-_x2;//注意虽然当前层有2n-1个数,但_x和_x的序数和并不是2n-1
dn=abs(n1-n2);
_dx=abs(ceil(_x1*1.0/2)-ceil(_x2*1.0/2));//看图
dx_=abs(ceil(x1_*1.0/2)-ceil(x2_*1.0/2));
cout<<dn+_dx+dx_<<endl;
}
return 0;
}
辅助图