题目链接: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; }
辅助图